Я пытаюсь создать функцию в пакете, которая возвращает таблицу. Я надеюсь вызвать функцию один раз в пакете, но иметь возможность повторно использовать свои временные интервалы данных. Хотя я знаю, что создаю временные таблицы в Oracle, я надеялся сохранить вещи СУХОЙ.Создайте функцию Oracle, которая возвращает таблицу
До сих пор, это то, что у меня есть:
Заголовок:
CREATE OR REPLACE PACKAGE TEST AS
TYPE MEASURE_RECORD IS RECORD (
L4_ID VARCHAR2(50),
L6_ID VARCHAR2(50),
L8_ID VARCHAR2(50),
YEAR NUMBER,
PERIOD NUMBER,
VALUE NUMBER
);
TYPE MEASURE_TABLE IS TABLE OF MEASURE_RECORD;
FUNCTION GET_UPS(
TIMESPAN_IN IN VARCHAR2 DEFAULT 'MONTLHY',
STARTING_DATE_IN DATE,
ENDING_DATE_IN DATE
) RETURN MEASURE_TABLE;
END TEST;
тела:
CREATE OR REPLACE PACKAGE BODY TEST AS
FUNCTION GET_UPS (
TIMESPAN_IN IN VARCHAR2 DEFAULT 'MONTLHY',
STARTING_DATE_IN DATE,
ENDING_DATE_IN DATE
) RETURN MEASURE_TABLE IS
T MEASURE_TABLE;
BEGIN
SELECT ...
INTO T
FROM ...
;
RETURN T;
END GET_UPS;
END TEST;
Заголовок компилирует, тело не делает. Одно сообщение об ошибке - «Недостаточно значений», что, вероятно, означает, что я должен выбирать в MEASURE_RECORD, а не в MEASURE_TABLE.
Что мне не хватает?
Я предполагаю, что использование курсора будет более ресурсоемким (т. Е. Медленнее), чем использование временной таблицы. Я прав? Мне нужно сгруппировать результаты этой функции. Означает ли это ваши рекомендации? – craig
Что касается курсора, да, я считаю, что они не очень хороши для производительности, поэтому, скорее всего, быстрее сделать BULK COLLECT, как сказал Тони, а затем перебрать массив. Это будет зависеть от количества строк, с которыми вы имеете дело, и других соображений производительности. Что касается группировки результатов, я не уверен, но кажется вероятным, что временная таблица была бы более эффективной, чем конвейерная функция в любом случае. Я бы предложил больше исследований (или еще лучше экспериментировал). Я задал бы вопрос на http://asktom.oracle.com. –
Просьба пояснить нижний план. –