Вопрос по oracle11g, function, plsql, oracle – Возвращение таблицы из функции Oracle

3

Я рассмотрел многие решения здесь, чтобы попытаться решить эту проблему, и они продвинулись довольно далеко, но теперь я нахожусь в сорняках из-за некоторых ошибок, которые я, кажется, не могу обойти.

Я на Oracle 11g. Мне нужна функция для возврата набора записей (таблица). Вот код, который я использую:

CREATE TYPE T_TABLE IS OBJECT
(
    Field1 int
    , Field2 int
);

CREATE TYPE T_TABLE_COLL IS TABLE OF T_TABLE;

CREATE OR REPLACE FUNCTION FN_MyFunction
RETURN T_TABLE_COLL 
IS
BEGIN
  FOR I IN (SELECT Field1, Field2 FROM Table1) LOOP
    IF I.Field1 = 1 THEN
        BEGIN           
            INSERT INTO T_TABLE     
            SELECT Field1, Field2
            FROM Table2
            WHERE Field2 = I.Field2;
        END;
    ELSIF I.Field1 = 2 THEN
        BEGIN           
            INSERT INTO T_TABLE     
            SELECT Field1, Field2
            FROM Table2
            WHERE Field2 = I.Field2;
        END;  
  END IF;
  END LOOP;
  RETURN T_SMRYACCT_TABLE_COLL;
END;

Ошибки, которые я получаю от этого:

Statement Ignored on the FUNCTION FN_MyFunction line and PL/SQL: ORA-04044: procedure, function, package, or type is not allowed here on each line INSERT INTO T_TABLE_COLL line

PLS-00330: invalid use of type name or subtype name on the RETURN line

Что я делаю не так с типами таблиц?

Мне нужно объединить результаты с дополнительными таблицами, я не верю, что мог бы использовать SP в предложении соединения. Matt
Если вы делаете вставку / обновление или удаление, используйте хранимую процедуру, а не функцию. Jåcob

Ваш Ответ

1   ответ
5

T_TABLE_COLL это коллекция. Вы не можете использоватьinsert на коллекции.

RETURN T_TABLE_COLL
IS
  l_res_coll T_TABLE_COLL;
  l_index number;
BEGIN
  l_res_coll := T_TABLE_COLL();
  FOR I IN (SELECT col1, col2 FROM Table1)
  LOOP
    IF I.col1 = 1 THEN
      l_res_coll.extend;
      l_index := l_res_coll.count;  
      l_res_coll(l_index):= T_TABLE(i.col1, i.col2);
    END IF;
  END LOOP;
  return l_res_coll;
END;

Функция в действии

select *
  from table(FN_MyFunction())

Чтобы получить больше информации о том, что такое коллекции и как их использовать, прочитайтеэтот

Спасибо за ответ. Я пропустил, что это была коллекция. Тем не менее, есть еще один вопрос: видите ли вы более простые способы вернуть таблицу из функции? Я на самом деле конвертирую код TSQL, который использовал функцию табличного значения, которую нелегко конвертировать в PLSQL. Matt
Взгляните на этоdocs.oracle.com/cd/E11882_01/appdev.112/e10765/….
Слава за ответ! Одно быстрое замечание: вы удалилиelsif, который ничего не делал. Я думаю, что это была ошибка кодирования со стороны OPs, а не что-нибудь еще ...
исправил ELSIF, чтобы это было актуально, это была ошибка разговора. фактический SQL имеет около 6 ELSIF, и не нужно было публиковать их все. Matt

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