FETCH BULK COLLECT в коллекцию на основе курсора
От: bmw  
Дата: 04.03.07 16:55
Оценка:
Помогите разобраться с проблемой.
Пробую выполнить 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 в коллекцию на основе курсора
От: wildwind Россия  
Дата: 04.03.07 17:25
Оценка:
Здравствуйте, bmw, Вы писали:

bmw>Пробую выполнить fetch с опцией bulk collect в коллекцию на основе курсора.

bmw>Получаю сообщение об ошибке:выражение l_emp в списке INTO имеет не верный тип.
bmw>Что делаю не правильно (ниже пример кода):

Вроде нет ошибок. На какой версии выполняешь? Выборка в коллекцию записей поддержана с 9.2.
Re[2]: FETCH BULK COLLECT в коллекцию на основе курсора
От: bmw  
Дата: 04.03.07 17:34
Оценка:
Здравствуйте, wildwind, Вы писали:

W>Вроде нет ошибок. На какой версии выполняешь? Выборка в коллекцию записей поддержана с 9.2.


Все правильно, 9.2.0.1.0

при этом если то же самое делать с помощью неявного курсора, то все работает.
Re[3]: FETCH BULK COLLECT в коллекцию на основе курсора
От: wildwind Россия  
Дата: 04.03.07 18:25
Оценка:
Здравствуйте, bmw, Вы писали:

bmw>Все правильно, 9.2.0.1.0

bmw>при этом если то же самое делать с помощью неявного курсора, то все работает.

Я скопировал твой код, заменив только имя таблицы. Все работает, 9.2.0.7.0. Может проблема в самой таблице? Нет ли там столбцов с "необычными" типами?
Re[4]: FETCH BULK COLLECT в коллекцию на основе курсора
От: bmw  
Дата: 04.03.07 19:07
Оценка:
Здравствуйте, wildwind, Вы писали:

W>Я скопировал твой код, заменив только имя таблицы. Все работает, 9.2.0.7.0. Может проблема в самой таблице? Нет ли там столбцов с "необычными" типами?


Да нет, это таблица из оракловой схемы scott.
Re[4]: FETCH BULK COLLECT в коллекцию на основе курсора
От: bmw  
Дата: 04.03.07 19:14
Оценка:
вот параметры сервера и структура таблицы:

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 в коллекцию на основе курсора
От: wildwind Россия  
Дата: 04.03.07 19:22
Оценка:
Здравствуйте, bmw, Вы писали:

bmw>вот параметры сервера и структура таблицы:


SQL*Plus: Release 8.1.7.0.0 - Production on Sun Mar 4 22:20:30 2007

(c) Copyright 2000 Oracle Corporation.  All rights reserved.

Enter password:

Connected to:
Oracle9i Enterprise Edition Release 9.2.0.7.0 - 64bit Production
With the Partitioning option
JServer Release 9.2.0.7.0 - Production

SQL> create table tmp_emp (
  2    EMPNO NUMBER(4) NOT NULL,
  3    ENAME VARCHAR2(10),
  4    JOB VARCHAR2(9),
  5    MGR NUMBER(4),
  6    HIREDATE DATE,
  7    SAL NUMBER(7,2),
  8    COMM NUMBER(7,2),
  9    DEPTNO NUMBER(2)
 10  )
 11  /

Table created.

SQL> DECLARE
  2
  3  cursor l_cur is
  4  select * from tmp_emp;
  5
  6  type l_cur_tab is table of l_cur%rowtype index by binary_integer;
  7
  8  l_emp l_cur_tab;
  9
 10  BEGIN
 11
 12  open l_cur;
 13  fetch l_cur bulk collect into l_emp;
 14  close l_cur;
 15
 16  END;
 17  /

PL/SQL procedure successfully completed.

SQL>


Напрягай админов
Re[4]: FETCH BULK COLLECT в коллекцию на основе курсора
От: bmw  
Дата: 04.03.07 19:23
Оценка:
Самое интересное, что следующий код компилится без проблем:

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;
select * bulk collect into l_emp from emp;

END;

Весь день сегодня бьюсь...
В чем же собака порылась???
Re[6]: FETCH BULK COLLECT в коллекцию на основе курсора
От: bmw  
Дата: 04.03.07 19:26
Оценка:
Здравствуйте, wildwind, Вы писали:

W>Напрягай админов


Да это я дома на ноуте шаманю.
Т.е. сам себе админ.
Re[7]: FETCH BULK COLLECT в коллекцию на основе курсора
От: wildwind Россия  
Дата: 04.03.07 20:19
Оценка:
Здравствуйте, bmw, Вы писали:

W>>Напрягай админов


bmw>Да это я дома на ноуте шаманю.

bmw>Т.е. сам себе админ.

Тогда накатывай патчи... Что еще посоветовать? Разве что поискать на sql.ru, там конкретных случаев побольше.
Re: FETCH BULK COLLECT в коллекцию на основе курсора
От: Пингвиненок Россия  
Дата: 05.03.07 08:38
Оценка:
Здравствуйте, bmw, Вы писали:

Сранно. На десятке работает.
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 в коллекцию на основе курсора
От: WaR_RioR Россия  
Дата: 05.03.07 09:56
Оценка:
Здравствуйте, bmw, Вы писали:

bmw>Здравствуйте, wildwind, Вы писали:


W>>Вроде нет ошибок. На какой версии выполняешь? Выборка в коллекцию записей поддержана с 9.2.


bmw>Все правильно, 9.2.0.1.0


bmw>при этом если то же самое делать с помощью неявного курсора, то все работает.


Информация с www.oracle.com

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


Поднимайте версию ORACLE, не иначе...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.