Я использую Oracle (10g.2) в качестве программиста PHP почти 3 года, но когда я дал задание, я впервые попытался использовать курсоры ref и типы коллекций. И я искал в Интернете, когда столкнулся с проблемами, и эта ошибка ora-00932 действительно поразила меня. Мне нужна старая рука.
Вот то, с чем я занимался: я хочу выбрать строки из таблицы и поместить их в указатель ref, а затем, используя тип записи, собрать их в ассоциативный массив. И снова из этого ассоциативного массива сделайте указатель ref. Не спрашивайте меня, почему, я пишу такой сложный код, потому что он мне нужен для более сложных заданий. Я могу вас сбить с толку, поэтому позвольте мне показать вам свои коды.
У меня есть 2 типа, определенные на вкладке типов в Toad. Один из них - объектный тип:
CREATE OR REPLACE
TYPE R_TYPE AS OBJECT(sqn number,firstname VARCHAR2(30), lastname VARCHAR2(30));
Другой тип коллекции, который использует тип объекта, созданный выше:
CREATE OR REPLACE
TYPE tr_type AS TABLE OF r_type;
Затем создаю пакет:
CREATE OR REPLACE PACKAGE MYPACK_PKG IS
TYPE MY_REF_CURSOR IS REF CURSOR;
PROCEDURE MY_PROC(r_cursor OUT MY_REF_CURSOR);
END MYPACK_PKG;
Тело пакета:
CREATE OR REPLACE PACKAGE BODY MYPACK_PKG AS
PROCEDURE MY_PROC(r_cursor OUT MY_REF_CURSOR) AS
rcur MYPACK_PKG.MY_REF_CURSOR;
sql_stmt VARCHAR2(1000);
l_rarray tr_type := tr_type();
l_rec r_type;
BEGIN
sql_stmt := 'SELECT 1,e.first_name,e.last_name FROM hr.employees e ';
OPEN rcur FOR sql_stmt;
LOOP
fetch rcur into l_rec;
exit when rcur%notfound;
l_rarray := tr_type( l_rec );
END LOOP;
CLOSE rcur;
--OPEN r_cursor FOR SELECT * FROM TABLE(cast(l_rarray as tr_type) );
END MY_PROC;
END MYPACK_PKG;
Я закомментировал последнюю строку, в которой открываю указатель ref. Потому что это вызывает еще одну ошибку, когда я запускаю процедуру в редакторе SQL Toad, и это второй вопрос, который я задам. И, наконец, я запускаю код в Toad:
variable r refcursor
declare
r_out MYPACK_PKG.MY_REF_CURSOR;
begin
MYPACK_PKG.MY_PROC(r_out);
:r := r_out;
end;
print :r
Там я получаю ошибку ora-00932.