2014-01-16 4 views
6
CREATE OR REPLACE TYPE ty_1 AS OBJECT (fn VARCHAR2(100), 
             sl NUMBER, 
             hd DATE); 
CREATE OR REPLACE TYPE ty_1_table AS TABLE OF ty_1; 

CREATE OR REPLACE FUNCTION FN_RET_COL 
    RETURN ty_1_table 
AS 
    c ty_1_table := TY_1_TABLE(); 
    BEGIN 
    c.extend; 
    C(1) := TY_1('A', 1, '10-JUN-2013'); 
    c.extend; 
    C(2) := TY_1('B', 2, '11-JUN-2013'); 
    c.extend; 
    C(3) := TY_1('C', 3, '12-JUN-2013'); 

    RETURN c; 
    END; 

CREATE OR REPLACE FUNCTION FN_RET_PIPE RETURN ty_1_table PIPELINED IS 
    BEGIN 
    PIPE ROW (TY_1('A', 1, '10-JUN-2013')); 
    PIPE ROW (TY_1('B', 2, '11-JUN-2013')); 
    PIPE ROW (TY_1('C', 3, '12-JUN-2013')); 
    END; 

SELECT * FROM TABLE (fn_ret_col); 

SELECT * FROM TABLE (fn_ret_pipe); 

Первый FN_RET_COL является обычной функцией таблицы и второй FN_RET_PIPE является конвейерной функцией. Я изучал в книге, как Регулярные функции таблицы требуют, чтобы коллекции были полностью заполнены до их возвращения, где PIPELINED FUNCTION используют вызов PIPE ROW, чтобы вытолкнуть строки из функции, как только они будут созданы, вместо создания таблицы , сохраняя память и позволяя последующей обработке запускать до создания всех строк. Я сомневаюсь: как PIPELINED Function сохраняет память? Если я не ошибаюсь, он соединяет все строки и сохраняет их в области памяти, а затем печатает все строки в консоли. Или это похоже на то, что он напрямую печатает ряд за строкой, как только новая запись будет передана на консоль без сохранения ее в любом месте?Разница между функцией таблицы и конвейерной функцией?

CREATE OR REPLACE FUNCTION FN_RET_COL RETURN TY_1_TABLE 
PIPELINED IS 
BEGIN 
    PIPE ROW(TY_1('A',1,'10-JUN-2013')); 
    DBMS_LOCK.sleep(seconds => 10); 
    PIPE ROW(TY_1('B',2,'11-JUN-2013')); 
    DBMS_LOCK.sleep(seconds => 10); 
    PIPE ROW(TY_1('C',3,'12-JUN-2013')); 
END; 

Если мой второй случай прав, то как работает вышеуказанный код?

ответ

9

Pipelined функции, очень классический пример, где вы делаете SELECT * FROM table name в SQL*Plus. Что происходит, Oracle передает данные из таблицы.

Как смотреть видео на YouTube.

Пожалуйста, обратите внимание на слово «Streaming» .. И в нашей функции мы определим, сколько строк мы поток .. Каждый потоковома ряда сразу же доступен вызывающий абонент. Pipelining означает, что в условиях неспешного мужчины, не заставляйте меня ждать, пока вы закончите, дайте мне то, что у вас есть, и продолжайте обрабатывать и обновлять меня одновременно.

В последнюю процедуре, после конвейера каждой строки, вы инициировать sleep вызов для 10s, поэтому запись Поточных вызывающего абонента каждые 10 секунд.

И нормальная функция таблицы будет продолжать ждать, пока не завершится вся обработка, а затем вернет ссылку на курсор набора результатов.

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

+1

Превосходное объяснение .. Это ясно .. – ramesh538

+0

Спасибо, пожалуйста, отметьте его принятым, если вы удовлетворены! :) –

+0

CREATE OR REPLACE FUNCTION FN_RET_COL ВОЗВРАТ TY_1_TABLE PIPELINED IS НАЧАТЬ для г в (SELECT first_name, SALARY, hire_date ОТ СОТРУДНИКОВ ГДЕ ROWNUM <11) петли ТРУБА СТРОКА (TY_1 (i.FIRST_NAME, i.SALARY, i.HIRE_DATE)); DBMS_LOCK.sleep (seconds => 1); контур конца; END; SELECT A.FN, LOCALTIMESTAMP FROM TABLE (FN_RET_COL) A; Здесь я получаю то же время, что и функция таблицы. Зачем? На самом деле он должен возвратиться, как только строка будет передана по трубопроводу. – ramesh538

Смежные вопросы