Помогите разобраться с проблемой.
Пробую выполнить fetch с опцией bulk collect в коллекцию на основе курсора.
Получаю сообщение об ошибке:выражение l_emp в списке INTO имеет не верный тип.
Что делаю не правильно (ниже пример кода):
DECLARE
cursor l_cur is
select * from emp;
type l_cur_tab is table of l_cur%rowtype index by binary_integer;
l_emp l_cur_tab;
BEGIN
open l_cur;
fetch l_cur bulk collect into l_emp;
close l_cur;
END;
Re: FETCH BULK COLLECT в коллекцию на основе курсора
Здравствуйте, bmw, Вы писали:
bmw>Пробую выполнить fetch с опцией bulk collect в коллекцию на основе курсора. bmw>Получаю сообщение об ошибке:выражение l_emp в списке INTO имеет не верный тип. bmw>Что делаю не правильно (ниже пример кода):
Вроде нет ошибок. На какой версии выполняешь? Выборка в коллекцию записей поддержана с 9.2.
Re[2]: FETCH BULK COLLECT в коллекцию на основе курсора
Здравствуйте, wildwind, Вы писали:
W>Я скопировал твой код, заменив только имя таблицы. Все работает, 9.2.0.7.0. Может проблема в самой таблице? Нет ли там столбцов с "необычными" типами?
Да нет, это таблица из оракловой схемы scott.
Re[4]: FETCH BULK COLLECT в коллекцию на основе курсора
Oracle9i Enterprise Edition Release 9.2.0.1.0 — Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 — Production
SQL> desc emp;
Имя Пусто? Тип
----------------------------------------- -------- -------------
EMPNO NOT NULL NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
Re[5]: FETCH BULK COLLECT в коллекцию на основе курсора
DECLARE
CURSOR c
IS
SELECT CHR (ROWNUM + 191) AS ch
FROM DUAL
CONNECT BY LEVEL <= 64;
TYPE t IS TABLE OF c%ROWTYPE
INDEX BY BINARY_INTEGER;
t1 t;
BEGIN
OPEN c;
FETCH c
BULK COLLECT INTO t1;
CLOSE c;
FOR i IN t1.FIRST .. t1.LAST
LOOP
DBMS_OUTPUT.put_line (t1 (i).ch);
END LOOP;
END;
То что меня не убивает, делает меня умнее.
Re[3]: FETCH BULK COLLECT в коллекцию на основе курсора
Здравствуйте, bmw, Вы писали:
bmw>Здравствуйте, wildwind, Вы писали:
W>>Вроде нет ошибок. На какой версии выполняешь? Выборка в коллекцию записей поддержана с 9.2.
bmw>Все правильно, 9.2.0.1.0
bmw>при этом если то же самое делать с помощью неявного курсора, то все работает.
Subject: BULK COLLECT INTO Collection of Records Fails With PLS-00597
Doc ID: Note:227935.1 Type: PROBLEM
Last Revision Date: 31-JAN-2003 Status: PUBLISHED
* fact: PL/SQL 9.2.0.2
* fact: PL/SQL 9.2.0.1
* symptom: BULK COLLECT INTO Collection Of Records Fails
* symptom: PLS-00597: expression %s in the INTO list is of wrong type
* change: NOTE ROLE: To reproduce:
SQL> declare cursor c is select * from emp; type emptab is table of c%rowtype; r EmpTab; begin open c; fetch c bulk collect into r; end; /
* cause: Before Oracle9i 9.2 there was an restriction of BULK COLLECT INTO colletion of records, this restriction is lifted,
though FETCH..BULK COLLECT INTO a PL/SQL collection of records incorrectly raises error PLS-00597 when the record type is defined
as a PL/SQL record or using CURSOR%ROWTYPE. No error is raised if the record is defined using TABLE%ROWTYPE.
Reference: Bug 2243411 PLS-00597 from "FETCH..BULK COLLECT INTO"
fix:
This is fixed in Oracle9i 9.2.0.3 and higher versions
Workaround:
Use TABLE%ROWTYPE to define COLLECTions of records for FETCH .. BULK COLLECT
INTO
Like:
SQL> set serveroutput on
SQL> declare
cursor c is
select * from emp;
type emptab is table of emp%rowtype;
r emptab;
begin
open c;
fetch c bulk collect into r;
for i in r.first .. r.last loop
dbms_output.put_line(r(i).ename);
end loop;
end;
/
Reference:
PL/SQL User's Guide and Reference Release 2 (9.2)
Chapter: PL/SQL Collections and Records
Section: Restrictions on BULK COLLECT
PL/SQL User's Guide and Reference Release 8.1.6
Chapter: Collections and Records
Section: Restrictions on BULK COLLECT