【问题标题】:How Do I Return a Collection from a PL/SQL Package如何从 PL/SQL 包中返回集合
【发布时间】:2020-08-20 14:20:01
【问题描述】:

我目前正在尝试想出一种从 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。

【问题讨论】:

  • 很有可能。你的方法是正确的。我没有从一般语法的角度进行检查,但这应该可以工作并为您提供所需的结果。
  • 我相信您只是缺少集合的初始化。试试v_records VTABLE := VTABLE();
  • 正如@ChrisHep 所指出的,您需要初始化 v_records,但您还需要将索引引用到您正在分配值的 v_records 中,例如v_records(v_records.last).id := r_record.id;

标签: plsql oracle11g oracle-sqldeveloper


【解决方案1】:

带有提供的 cmets 的代码可以工作,但使用 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    • 2017-11-07
    • 1970-01-01
    • 2011-12-13
    • 2018-06-02
    • 2020-04-08
    相关资源
    最近更新 更多