Короче говоря, я предлагаю обсудить код, который вы видите ниже.
При запуске:
-
Компилятор Oracle 11 повышает
"PLS-00306: неправильное количество или типы аргументов при вызове в 'PIPE_TABLE'"
"PLS-00642: Типы локальных коллекций, не разрешенные в SQL-заявлении"
-
Oracle 12 компилирует следующий пакет без таких предупреждений, но у нас есть неожиданность во время выполнения
при выполнении анонимного блока как есть - все в порядке (мы можем передать некоторые строки в функции
pipe_table
- это не влияет)теперь пусть раскомментирует строку с помощью
hello;
или поместит туда вызов любой процедуры и снова запустите измененный анонимный блок мы получаем "ORA-22163: коллекции левой руки и правой стороны не одного типа"
И вопрос: Предоставляет ли Oracle 12 локальные типы коллекций в SQL? Если да, то что не так с кодом PACKAGE buggy_report
?
CREATE OR REPLACE PACKAGE buggy_report IS
SUBTYPE t_id IS NUMBER(10);
TYPE t_id_table IS TABLE OF t_id;
TYPE t_info_rec IS RECORD ( first NUMBER );
TYPE t_info_table IS TABLE OF t_info_rec;
TYPE t_info_cur IS REF CURSOR RETURN t_info_rec;
FUNCTION pipe_table(p t_id_table) RETURN t_info_table PIPELINED;
FUNCTION get_cursor RETURN t_info_cur;
END buggy_report;
/
CREATE OR REPLACE PACKAGE BODY buggy_report IS
FUNCTION pipe_table(p t_id_table) RETURN t_info_table PIPELINED IS
l_table t_id_table;
BEGIN
l_table := p;
END;
FUNCTION get_cursor RETURN t_info_cur IS
l_table t_id_table;
l_result t_info_cur;
BEGIN
OPEN l_result FOR SELECT * FROM TABLE (buggy_report.pipe_table(l_table));
RETURN l_result;
END;
END;
/
DECLARE
l_cur buggy_report.t_info_cur;
l_rec l_cur%ROWTYPE;
PROCEDURE hello IS BEGIN NULL; END;
BEGIN
l_cur := buggy_report.get_cursor();
-- hello;
LOOP
FETCH l_cur INTO l_rec;
EXIT WHEN l_cur%NOTFOUND;
END LOOP;
CLOSE l_cur;
dbms_output.put_line('success');
END;
/