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;
Если мой второй случай прав, то как работает вышеуказанный код?
Превосходное объяснение .. Это ясно .. – ramesh538
Спасибо, пожалуйста, отметьте его принятым, если вы удовлетворены! :) –
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