首页 > 解决方案 > 如何从 PL/SQL 包中返回集合

问题描述

我目前正在尝试想出一种从 PL/SQL 包返回数据集合的方法。以下代表了包中指定的内容以及我正在尝试做的事情:

这是包装规格:

   TYPE MYRECORD IS RECORD
   (
   ID NUMBER,
   SOME_TEXT1 VARCHAR2(50),
   SOME_TEXT2 VARCHAR2(50),
   SOME_TEXT3 VARCHAR2(50),  
   SOME_TEXT4 VARCHAR2(255),
   );

  TYPE VTABLE is table of MYRECORD;

 FUNCTION lookup_values (
                  ANUMBER IN   VARCHAR2,
                  SOMETEXT1        IN   VARCHAR2,
                  SOMETIME  IN   VARCHAR2,
 ) RETURN VTABLE

当我在函数中引用 VTABLE 的实例时,我的问题就出现了:

这是在包体中:

 FUNCTION Lookup_Values(
                  ANUMBER       IN   VARCHAR2,
                  SOME_TEXT1        IN   VARCHAR2,
                  SOME_TIME  IN   VARCHAR2,

         ) RETURN  VTABLE
IS


      v_records  VTABLE;
      r_record    MYRECORD;

      CURSOR OUR_RECORDS IS
      SELECT * FROM OUR_TABLE

 BEGIN

      OPEN OUR_RECORDS 
      LOOP
      FETCH OUR_RECORDS 
      INTO r_record;
      EXIT WHEN OUR_RECORDS %NOTFOUND;

 -- I want to do something like the pseudo code below.  Is it possible?
     v_records.Extend(1);
     v_records.ID := r_record.ID;
     v_records.SOME_TEXT1 := r_record.SOMETEXT1;
     v_records.SOME_TEXT2 := r_record.SOMETEXT2;
     v_records.SOME_TEXT3 := r_record.SOMETEXT3;
     v_records.SOME_TEXT4 := r_record.SOMETEXT4;

    END LOOP;

    RETURN (v_records);
 END;

希望我已经设法传达了我想要实现的目标。道歉并非如此。如果有任何不清楚的地方,请反馈回来,我会尽力澄清。

亲切的问候保罗J。

标签: plsqloracle11goracle-sqldeveloper

解决方案


您提供的带有注释的代码可以工作,但使用 BULK COLLECT 会更高效。

FUNCTION Lookup_Values(
                  ANUMBER       IN   VARCHAR2,
                  SOME_TEXT1        IN   VARCHAR2,
                  SOME_TIME  IN   VARCHAR2,

         ) RETURN  VTABLE
IS
      v_records  VTABLE;

      CURSOR OUR_RECORDS IS
      SELECT * FROM OUR_TABLE

BEGIN

      OPEN OUR_RECORDS;
      FETCH OUR_RECORDS BULK COLLECT INTO v_records;
      -- You may want to limit the number of records returned in
      -- in which case use the limit clause:
      -- FETCH OUR_RECORDS BULK COLLECT INTO v_records LIMIT 50;
      CLOSE OUR_RECORDS;

      RETURN (v_records);
 END;

推荐阅读