Как вернуть коллекцию из пакета PL / SQL - PullRequest
0 голосов
/ 05 мая 2020

В настоящее время я пытаюсь придумать способ возврата коллекции данных из пакета 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;

Надеюсь, мне удалось передать то, что я пытаюсь достичь. Извинения по этому поводу нет. Если что-то неясно, просто сообщите об этом, и я постараюсь уточнить.

С уважением, Пол Дж.

1 Ответ

0 голосов
/ 06 мая 2020

Ваш код с предоставленными комментариями будет работать, но использование 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;
...