как преобразовать глобальную временную таблицу в набор/тип в процедуре оракула

У меня есть процедура, которая использует временную таблицу. Я хочу избавиться от временной таблицы и использовать набор для удаления ввода-вывода. это имеет приблизительно 5 000 записей.

Я хочу вставить данные в этот набор затем, я хочу получить доступ к набору как:

select * from table(my_type_for_gtt)

Я не мог найти пример этого. Я смущен, я должен сначала создать тип записи и затем создать как таблица?

кто-то может показать быстрый небольшой пример?

1
задан learn_plsql 14 July 2010 в 21:37
поделиться

1 ответ

Вы движетесь в правильном направлении - сначала создайте свои типы

CREATE TYPE myEntry
AS
OBJECT
  (attr1 NUMBER,
   attr2 VARCHAR2(20)
  );

CREATE TYPE myCollection AS TABLE OF myEntry;

Затем несколько примеров функций, возвращающих «строки» вашей коллекции

CREATE OR REPLACE FUNCTION ExampleMyCollection1
RETURN myCollection  
IS
   lCol myCollection := myCollection(); /* Must initialise empty collection */
BEGIN
    lCol.EXTEND(1000);
    /* Populate the collection entries with objects */
    FOR i IN 1..1000 LOOP
        lCol(i) := myEntry(i,'An entry for '||i);
    END LOOP;
    RETURN lCol;
END ExampleMyCollection1;

SELECT * FROM TABLE(ExampleMyCollection1);

Вариация - на этот раз мы используем конвейерную обработку, чтобы результаты возвращаются в запрос по мере их создания. Обратите внимание, что несмотря на то, что это функция, для ТРУБОПРОВОДНОЙ функции нет конца ВОЗВРАТА.

CREATE OR REPLACE FUNCTION ExampleMyCollection2
RETURN myCollection PIPELINED
IS
BEGIN
    FOR i IN 1..1000 LOOP
        PIPE ROW(myEntry(i,'An entry for '||i));
    END LOOP;
END ExampleMyCollection2;

SELECT * FROM TABLE(ExampleMyCollection2);

Чтобы заменить временную таблицу данными, находящимися исключительно в памяти, вам понадобится что-то для хранения вашей коллекции, то есть пакет с состоянием.

CREATE OR REPLACE PACKAGE pMyCollection
AS
   PROCEDURE AddEntry(entry IN myEntry);

   FUNCTION fCurrentCollection RETURN myCollection;

   PROCEDURE ClearEntries;

END pMyCollection;

CREATE OR REPLACE PACKAGE BODY pMyCollection
AS
   /* Stateful variable to hold the collection */
   pCollection myCollection := myCollection();

   PROCEDURE AddEntry(entry IN myEntry)
   IS
   BEGIN
      pCollection.EXTEND;
      pCollection(pCollection.LAST) := entry;
   END;

   PROCEDURE ClearEntries 
   IS
   BEGIN
      pCollection.DELETE;
   END ClearEntries;

   FUNCTION fCurrentCollection
   RETURN myCollection
   IS
   BEGIN
      /* Return whole collection - we could use pipelining and parameters to return partial elements */
      RETURN pCollection;
   END fCurrentCollection;

END pMyCollection;
2
ответ дан 2 September 2019 в 23:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: