Я использую 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.