CURSOR FETCH

floppyZ
Дата: 21.02.2007 17:28:21
Добрый вечер.
PROCEDURE my_test (my_cur IN sysrecursor)
IS
tab t_type; -- êîëëåêöèÿ
BEGIN
   ...
   FETCH my_cur
       INTO tab.ID, tab.name
   ...    
END;
На входе курсор с различным количеством колонок потому что является результатом разных процедур, но в нем всегда есть ID и NAME.
Так вот как мне бы однозначно профетчить колонки из курсора в коллекию?
Типа FETCH my_cur.ID, my_cur.name INTO tab.ID, tab.name. Это возможно?
mcureenab
Дата: 21.02.2007 17:51:59
floppyZ
Типа FETCH my_cur.ID, my_cur.name INTO tab.ID, tab.name. Это возможно?


В native PL/SQL интерфейсе это невозможно. Используй DBMS_SQL или определись с порядком и количеством колонок в курсоре. Какие проблемы фиксировать набор полей в курсоре?
Elic
Дата: 21.02.2007 17:53:22
Если эти столбцы всегда первые и в предопределённом порядке и все передаваемые refcursor-ы открываются динамически, то можно.
Sevick
Дата: 21.02.2007 20:35:41
Elic
Если эти столбцы всегда первые и в предопределённом порядке и все передаваемые refcursor-ы открываются динамически, то можно.


Редкий случай без ссылки STFF :)

А как?
Elic
Дата: 21.02.2007 20:48:26
Sevick
Elic
Если эти столбцы всегда первые и в предопределённом порядке и все передаваемые refcursor-ы открываются динамически, то можно.
Редкий случай без ссылки STFF :)
А как?
На тебе и STFF Новое поколение плохо знает SQL Plus
mcureenab
Дата: 21.02.2007 21:01:19
Elic
Sevick
Elic
Если эти столбцы всегда первые и в предопределённом порядке и все передаваемые refcursor-ы открываются динамически, то можно.
Редкий случай без ссылки STFF :)
А как?
На тебе и STFF Новое поколение плохо знает SQL Plus


Ты хочешь сказать, что это работает?

SQL> \nSQL> declare\n  2    dummy varchar2(4000);\n  3    c sys_refcursor;\n  4  begin\n  5    /*pkg_my.proc(с);*/ open c for \'select 1, 2 from dual where dbms_random.value < 0.5\';\n  6    fetch c into dummy;\n  7    if c%found then\n  8      dbms_output.put_line(\'что-то возвращает\');\n  9    else\n 10      dbms_output.put_line(\'ничего не возвращает\');\n 11    end if;\n 12    close c;\n 13  end;\n 14  /\ndeclare\n*\nERROR at line 1:\nORA-00932: inconsistent datatypes: expected - got -\nORA-06512: at line 6\n\n\nSQL> 

Колоночка "2" явно лишняя.
Anton Demidov
Дата: 21.02.2007 21:07:26
Pаботает.
SQL*Plus: Release 9.2.0.6.0 - Production on Wed Feb 21 13:04:56 2007
Connected to:
Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64bit Production

--
Per rectum ad astrum
Anton Demidov
Дата: 21.02.2007 21:13:52
Но не работает в версиях 10.1.0.4 и 10.2.0.3


--
Per rectum ad astrum
Elic
Дата: 21.02.2007 21:14:56
mcureenab
Ты хочешь сказать, что это работает?
ORA-00932: inconsistent datatypes: expected - got -
Однако. На 10.2.0.3 уже не работает.
Получается, что на 9-ке работало из-за бага :) Тогда лучше все свои слова про "можно" возьму назад.
floppyZ
Дата: 22.02.2007 10:16:13
mcureenab
floppyZ
Типа FETCH my_cur.ID, my_cur.name INTO tab.ID, tab.name. Это возможно?


В native PL/SQL интерфейсе это невозможно. Используй DBMS_SQL или определись с порядком и количеством колонок в курсоре. Какие проблемы фиксировать набор полей в курсоре?


На форуме есть темы что DBMS_SQL рефкурсор вместе не работают