Я хочу задать вам еще один вопрос, я надеюсь, что это будет последним. В вашем последнем сообщении, если вы используете динамический sql, такой как 'sql_stmt: = SELECT e.empno, e.ENAME, NULL lastname FROM scott.emp e' и затем FOR cc IN (выберите sql_stmt FROM dual), а затем попытайтесь добраться до элементов курсора, написав, например, cc.empno, вы получите ошибку PLS-00302. Как вы можете ее обработать? Есть ли способ, потому что я должен использовать динамический SQL.

ользую Oracle (10g.2) в качестве программиста PHP почти 3 года, но когда я дал задание, я впервые попытался использовать ref-курсоры и типы коллекций. И я искал в Интернете, когда столкнулся с проблемами, и эта ошибка ora-00932 действительно поразила меня. Мне нужна помощь от старой руки.

Вот то, с чем я столкнулся: я хочу выбрать строки из таблицы и поместить их в курсор ref, а затем, используя тип записи, собрать их в ассоциативный массив. И снова из этого ассоциативного массива создайте курсор ref. Не спрашивайте меня, почему, я пишу такой сложный код, потому что он мне нужен для более сложного назначения. Возможно, я вас смущаю, поэтому я покажу вам свои коды.

У меня есть 2 типа, определенные на вкладке типов в жабе. Одним из них является тип объекта:

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;

Я закомментировал последнюю строку, где я открываю реф курсор. Потому что это вызывает другую ошибку, когда я запускаю процедуру в редакторе SQL 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.

Ответы на вопрос(1)

Ваш ответ на вопрос