powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как прокрутить реф-курсор в цикле ?
53 сообщений из 53, показаны все 3 страниц
Как прокрутить реф-курсор в цикле ?
    #33397901
Вопросик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос знающим людям:

Как прокрутить реф-курсор в цикле, если неизвестна его структура ?

то есть

open ref_c;

loop
fetch ref_c into ... -- куда ??? как объявить переменную для рекорда этого
-- курсора ??? Кол-во столбцов и их типы неизвестны,
-- (реф-курсор приходит из другой процедуры PL/SQL)
exit when ref_c%notfound;
..............
..............
end loop;
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33397908
alex-ls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВопросикВопрос знающим людям:

Как прокрутить реф-курсор в цикле, если неизвестна его структура ?

то есть

open ref_c;

loop
fetch ref_c into ... -- куда ??? как объявить переменную для рекорда этого
-- курсора ??? Кол-во столбцов и их типы неизвестны,
-- (реф-курсор приходит из другой процедуры PL/SQL)
exit when ref_c%notfound;
..............
..............
end loop;

Код: plaintext
1.
declare
 a2 ref_c%rowtype
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33397927
brant2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
for i in ref_c loop
...
end loop;
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33397976
Вопросик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не, ребята, че-то не так.



declare
ref_c sys_refcursor;
ref_c_rec ref_c%rowtype; -- уже здесь начинается ругань
begin
open ref_c;

loop
fetch ref_c into ref_c_rec;
exit when ref_c%notfound;
null;
end loop;
end;
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33398027
alex-ls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопросикне, ребята, че-то не так.

держи друг
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
declare
  cursor c1 is select * from dual;
  c2 c1%rowtype;
begin

open c1;
loop

fetch c1 into c2;
exit when c1%notfound;
 null;

end loop;
close c1;

end;

PL/SQL procedure successfully completed
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33398053
Вопросик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, друг !

А если приблизиться к суровой реальности ?

procedure DoSomething (xCur in sys_refcursor -- курсор приходит черт-те
-- откуда и неизвестно какой
--структуры
) is

begin
c2 c1%rowtype; -- на что эту конструкцию поменять ???
begin

open c1;
loop
fetch c1 into c2;
exit when c1%notfound;
null;
end loop;
close c1;

end;
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33398107
alex-ls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВопросикА если приблизиться к суровой реальности ?

а структура курсора меняется? Или он стабилен все же?
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33398155
brant2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВопросикСпасибо, друг !

А если приблизиться к суровой реальности ?

procedure DoSomething (xCur in sys_refcursor -- курсор приходит черт-те
-- откуда и неизвестно какой
--структуры
) is

begin
c2 c1%rowtype; -- на что эту конструкцию поменять ???
begin

open c1;
loop
fetch c1 into c2;
exit when c1%notfound;
null;
end loop;
close c1;

end;
Прокрутить курсор неизвестной структуры ты сможешь всегда, а вот извлечь отдельные данные из с2 - нет
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33398156
Вопросик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex-ls ВопросикА если приблизиться к суровой реальности ?

а структура курсора меняется? Или он стабилен все же?

К сожалению, меняется....
Реф-курсор формируется программно и кол-во колонок в нем зависит от данных.

может быть так

наименование банк 1 банк2 ........банкN
Бумага 20 30 650

кол-во банков меняется в соответсвии с кучей параметров и сколько их будет, заранее не определить.
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33398170
alex-ls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопросик alex-ls ВопросикА если приблизиться к суровой реальности ?

а структура курсора меняется? Или он стабилен все же?

К сожалению, меняется....
мда... тогда не знаю если бы не менялся можно было бы объявить курсор в пакете и по нему стряпать переменные. А так...
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33398209
Вопросик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
brant2000 ВопросикСпасибо, друг !

А если приблизиться к суровой реальности ?

procedure DoSomething (xCur in sys_refcursor -- курсор приходит черт-те
-- откуда и неизвестно какой
--структуры
) is

begin
c2 c1%rowtype; -- на что эту конструкцию поменять ???
begin

open c1;
loop
fetch c1 into c2;
exit when c1%notfound;
null;
end loop;
close c1;

end;
Прокрутить курсор неизвестной структуры ты сможешь всегда, а вот извлечь отдельные данные из с2 - нет

это ирония ? вместо c2 конечно же должен быть xCur, сорри.
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33398215
Вопросик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин опять тороплюсь ...

XCur вместо с1.
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33398235
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если знаешь Java, то можешь передать SYS_REFCURSOR в метод Java-класса, а там уж делать с ним что угодно. Тем более при наличии такой вещи как ResultSetMetaData.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create or replace and compile java source named "TestCursor" as
 import  java.sql.*;
 public   class  TestCursor {
   public   static   void  foo (ResultSet rs)  throws  SQLException {
    ResultSetMetaData rsmd = rs.getMetaData();
     while  (rs.next()) {
       for  ( int  i =  1 ; i < rsmd.getColumnCount(); i++) {
        System.out.print(rs.getString(i) + (i >  1  ? " : " : ""));
      }
      System.out.print("\n");
    }
  }
}
/
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
create or replace procedure test_cursor (cr sys_refcursor) as
  language java name 'TestCursor.foo(java.sql.ResultSet)';
/

declare cr sys_refcursor;
begin
  dbms_java.set_output( 20000 );
  open cr for 'select * from scott.emp';
  test_cursor(cr);
end;
/
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33398248
brant2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопросикблин опять тороплюсь ...

XCur вместо с1.
Как не называй получить данные из курсора неизвестной структуры в PL/SQL нельзя, только количество записей.
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33398467
Anatalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
brant2000 Вопросикблин опять тороплюсь ...

XCur вместо с1.
Как не называй получить данные из курсора неизвестной структуры в PL/SQL нельзя, только количество записей.

Очень даже можно
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
PROCEDURE REPAIR_TABLE (name_table IN varchar2, no_table in number)
-- процедура разбора операций
   is
   query_str  long;
   cod_error    number;
   v_zag_temp  rec_temp_table;
   v_cid number;
   v_recnum number;
   cnt number;
   i number;
   j number;
   flag number;
   flagok number;
BEGIN
  query_str:=query_str||' from T_'||name_table||' where cr_is_tran=1'||
    ' order by cr_op_numb,cr_op_type';
  v_cid:=dbms_sql.open_cursor;
  dbms_sql.parse(v_cid,query_str,dbms_sql.native);
  dbms_sql.DEFINE_COLUMN(v_cid, 1 ,v_zag_temp.rid, 18 );
  dbms_sql.DEFINE_COLUMN(v_cid, 2 ,v_zag_temp.v_cr_op_user, 12 );
  dbms_sql.DEFINE_COLUMN(v_cid, 3 ,v_zag_temp.v_cr_op_type, 1 );
  dbms_sql.DEFINE_COLUMN(v_cid, 4 ,v_zag_temp.v_cr_op_numb);
  dbms_sql.DEFINE_COLUMN(v_cid, 5 ,v_zag_temp.v_cr_is_tran);
  dbms_sql.DEFINE_COLUMN(v_cid, 6 ,v_zag_temp.v_cr_pr_numb);
  dbms_sql.DEFINE_COLUMN(v_cid, 7 ,v_zag_temp.v_cr_op_date);
  j:= 8 ;
  DEFINE_COLUMN(v_cid,j, 1 ); v_recnum:=dbms_sql.execute(v_cid);
  loop
   if DBMS_SQL.FETCH_ROWS(v_cid)> 0  then
     dbms_sql.COLUMN_VALUE(v_cid, 1 ,v_zag_temp.rid);
     dbms_sql.COLUMN_VALUE(v_cid, 2 ,v_zag_temp.v_cr_op_user);
     dbms_sql.COLUMN_VALUE(v_cid, 3 ,v_zag_temp.v_cr_op_type);
     dbms_sql.COLUMN_VALUE(v_cid, 4 ,v_zag_temp.v_cr_op_numb);
     dbms_sql.COLUMN_VALUE(v_cid, 5 ,v_zag_temp.v_cr_is_tran);
     dbms_sql.COLUMN_VALUE(v_cid, 6 ,v_zag_temp.v_cr_pr_numb);
     dbms_sql.COLUMN_VALUE(v_cid, 7 ,v_zag_temp.v_cr_op_date);
     if upper(v_zag_temp.v_cr_op_type)='I' then
       if flagok=v_zag_temp.v_cr_op_numb then
         cod_error:= update_data(name_table, v_cid, no_table,j, 1 );
         write_error_to_temp (name_table, v_zag_temp, cod_error);
       else
         cod_error:=INSERT_DATA (name_table, v_cid, no_table,j);
         write_error_to_temp (name_table, v_zag_temp, cod_error);
       end if;
     END IF;
     if upper(v_zag_temp.v_cr_op_type)= 'D' then
       if flag not in ( 1 , 9 ) then
         cod_error:= delete_data(name_table, v_cid, no_table,j);
         write_error_to_temp (name_table, v_zag_temp, cod_error);
       else
         variable_value(v_cid, 2 ,j);
         write_error_to_temp (name_table,v_zag_temp, 0 );
         flagok:=v_zag_temp.v_cr_op_numb;
       end if;
     end if;
     if upper(v_zag_temp.v_cr_op_type)='U' then
       cod_error:= update_data(name_table, v_cid, no_table,j, 0 );
       write_error_to_temp (name_table, v_zag_temp, cod_error);
     end if;
     else
       exit;
     end if;
  END LOOP;

  DBMS_SQL.CLOSE_CURSOR(v_cid);

exception
  when others then

    if dbms_sql.is_open(v_cid) then
      dbms_sql.close_cursor(v_cid);
    end if;

END;
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33398620
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatalex brant2000
Как не называй получить данные из курсора неизвестной структуры в PL/SQL нельзя, только количество записей.
Очень даже можно
Код: plaintext
1.
2.
PROCEDURE REPAIR_TABLE (name_table IN varchar2, no_table in number)
-- процедура разбора операций

Anatalex, таки шо же Вы хотели продемонстрировать данным примером?
Где тут неопределенная структура?
Аналогичный пример легко строится и с ref cursor, если программист заранее знает что в этом курсоре придет (количество полей и типы данных).
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33398638
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВопросикК сожалению, меняется....
Реф-курсор формируется программно и кол-во колонок в нем зависит от данных.
может быть так
наименование банк 1 банк2 ........банкN
Бумага 20 30 650
кол-во банков меняется в соответсвии с кучей параметров и сколько их будет, заранее не определить.О, так Ваш курсор имеет вполне предсказуемую структуру?
Тогда можно попробовать методом "научного втыка":
- насоздавать N рекордов с различным числом полей
- пытаться по очереди профетчить в каждый из рекордов, пока не попадешь в нужный
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33399255
Anatalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous ВопросикК сожалению, меняется....
Реф-курсор формируется программно и кол-во колонок в нем зависит от данных.
может быть так
наименование банк 1 банк2 ........банкN
Бумага 20 30 650
кол-во банков меняется в соответсвии с кучей параметров и сколько их будет, заранее не определить.О, так Ваш курсор имеет вполне предсказуемую структуру?
Тогда можно попробовать методом "научного втыка":
- насоздавать N рекордов с различным числом полей
- пытаться по очереди профетчить в каждый из рекордов, пока не попадешь в нужный

В dbms_sql достаточно средств, что бы определить структуру реф курсора, количество и типы полей. Остальное дело техники. Я привел лишь один из примеров использования
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33399342
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnatalexВ dbms_sql достаточно средств, что бы определить структуру реф курсора , количество и типы полей.Можно с этого места поподробнее? Примерчик какой... Обращаю особое внимание: речь идет именно о REF CURSOR.
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33399382
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnatalexВ dbms_sql достаточно средств, что бы определить структуру реф курсораdbms_sql не поддерживает ref cursor.
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33399492
chp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous AnatalexВ dbms_sql достаточно средств, что бы определить структуру реф курсора , количество и типы полей.Можно с этого места поподробнее? Примерчик какой... Обращаю особое внимание: речь идет именно о REF CURSOR.
Похоже этот товарисч снова путает теплое с мягким...
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33399586
Alex623
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если можно передать в процедуру инфу о структуре данных в курсоре то можно динамическим SQL разобрать
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33399596
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex623Если можно передать в процедуру инфу о структуре данных в курсоре то можно динамическим SQL разобратьВ таком случае и ref cursor как бы нафиг не нужен
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33399853
brant2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous ВопросикК сожалению, меняется....
Реф-курсор формируется программно и кол-во колонок в нем зависит от данных.
может быть так
наименование банк 1 банк2 ........банкN
Бумага 20 30 650
кол-во банков меняется в соответсвии с кучей параметров и сколько их будет, заранее не определить.О, так Ваш курсор имеет вполне предсказуемую структуру?
Тогда можно попробовать методом "научного втыка":
- насоздавать N рекордов с различным числом полей
- пытаться по очереди профетчить в каждый из рекордов, пока не попадешь в нужный
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33399930
Anatalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
brant2000 andrey_anonymous ВопросикК сожалению, меняется....
Реф-курсор формируется программно и кол-во колонок в нем зависит от данных.
может быть так
наименование банк 1 банк2 ........банкN
Бумага 20 30 650
кол-во банков меняется в соответсвии с кучей параметров и сколько их будет, заранее не определить.О, так Ваш курсор имеет вполне предсказуемую структуру?
Тогда можно попробовать методом "научного втыка":
- насоздавать N рекордов с различным числом полей
- пытаться по очереди профетчить в каждый из рекордов, пока не попадешь в нужный


Передавай не сам реф курсор, а номер курсора определенный с помощью того же dbms_sql и будет тебе счастье
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33399989
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnatalexПередавай не сам реф курсор, а номер курсора определенный с помощью того же dbms_sql и будет тебе счастьеБездумный гон пурги продолжается
Ты вопрос всё-таки прочитал бы.
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33400243
Anatalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic AnatalexПередавай не сам реф курсор, а номер курсора определенный с помощью того же dbms_sql и будет тебе счастьеБездумный гон пурги продолжается
Ты вопрос всё-таки прочитал бы.

Я то прочитал. А ты подумай для чего это. Или мозгов не хватает? Просто не известна структура запроса. Ну и что. Обработай его с помощью dbms_sql. Или весь мир на ref cursor как таковой сошелся? Только он и трава не расти.
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33400276
Anatalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
With PL/SQL8, you can now obtain information about the structure of the columns of your dynamic cursor. The DBMS_SQL.DESCRIBE_COLUMNS procedure obtains information about your dynamic cursor. Here is the header:

PROCEDURE DBMS_SQL.DESCRIBE_COLUMNS
(c IN INTEGER
,col_cnt OUT INTEGER
,desc_t OUT DBMS_SQL.DESC_TAB);

Parameters

c The pointer to the cursor.

col_cnt The number of columns in the cursor, which equals the number of rows defined in the PL/SQL table.

desc_t The PL/SQL table, which contains all of the column information. This is a table of records of type DBMS_SQL.DESC_REC (<table_type>), described below.

<table_type> Datatype Description
col_type BINARY_INTEGER Type of column described
col_max_len BINARY_INTEGER Maximum length of column value
col_name VARCHAR2(32) Name of the column
col_name_len BINARY_INTEGER Length of the column name
col_schema_name VARCHAR2(32) Name of column type schema if an object type
col_schema_name_len BINARY_INTEGER Length of schema name
col_precision BINARY_INTEGER Precision of column if a number
col_scale BINARY_INTEGER Scale of column if a number
col_charsetid BINARY_INTEGER ID of character set
col_charsetform BINARY_INTEGER Character set form
col_null_ok BOOLEAN TRUE if column can be NULL

The values for column types are as follows:

Datatype Number
VARCHAR2 1
NVARCHAR2 1
NUMBER 2
INTEGER 2
LONG 8
ROWID 11
DATE 12
RAW 23
LONG RAW 24
CHAR 96
NCHAR 96
MLSLABEL 106
CLOB (Oracle8) 112
NCLOB (Oracle8) 112
BLOB (Oracle8) 113
BFILE (Oracle8) 114
Object type (Oracle8) 121
Nested table Type (Oracle8) 122
Variable array (Oracle8) 123

When you call this program, you need to have declared a PL/SQL table based on the DBMS_SQL.DESC_T. You can then use PL/SQL table methods to traverse the table and extract the needed information about the cursor. The following anonymous block shows the basic steps you will perform when working with this built-in:

DECLARE
cur PLS_INTEGER := DBMS_SQL.OPEN_CURSOR;
cols DBMS_SQL.DESC_T;
ncols PLS_INTEGER;
BEGIN
DBMS_SQL.PARSE
(cur, 'SELECT hiredate, sal FROM emp', DBMS_SQL.NATIVE);
DBMS_SQL.DEFINE_COLUMN (cur, 1, SYSDATE);
DBMS_SQL.DEFINE_COLUMN (cur, 2, 1);
DBMS_SQL.DESCRIBE_COLUMNS (cur, ncols, cols);
FOR colind IN 1 .. ncols
LOOP
DBMS_OUTPUT.PUT_LINE (cols.col_name);
END LOOP;
DBMS_SQL.CLOSE_CURSOR (cur);
END;
/
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33400304
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnatalexИли весь мир на ref cursor как таковой сошелся?В постановке задачи - сошёлся. А решать незаданные задачи - это есть использование "мозгов, которых хватает"() для "пурги".
Чтобы отказаться от ref cursor в приёмнике, нужно также от него отказаться и в передатчике. Т.е. полный redesign. Сомневаюсь, что оно ему надо.

P.S. И не надо дампить килы доки
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33400326
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnatalexЯ то прочитал. А ты подумай для чего это. Или мозгов не хватает? Просто не известна структура запроса. Ну и что. Обработай его с помощью dbms_sql. Или весь мир на ref cursor как таковой сошелся? Только он и трава не расти.
1. Уважаемый, ну зачем же так грубо?
2. Решения проблемы у Вас нет, поскольку предложения отказаться от ref cursor Вы не вносили. Зато вносили предложение определить структуру ref cursor посредством dbms_sql... :)
3. "Весь мир", может, и не сошелся, но далеко не всегда можно обойтись передачей текста запроса. Например, если данные нужны в методе, который работает от имени другого пользователя... Или метод - поставщик данных используется в иных приложениях и не может быть изменен по соображениям совместимости или по условиям лицензионного соглашения.
4. Я не буду говорить про чуждые Вам концепции инкапсуляции, соображения сопровождаемости или хотя бы банальную безопасность (поищите по форуму sql injection).
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33400353
Anatalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous AnatalexЯ то прочитал. А ты подумай для чего это. Или мозгов не хватает? Просто не известна структура запроса. Ну и что. Обработай его с помощью dbms_sql. Или весь мир на ref cursor как таковой сошелся? Только он и трава не расти.
1. Уважаемый, ну зачем же так грубо?
2. Решения проблемы у Вас нет, поскольку предложения отказаться от ref cursor Вы не вносили. Зато вносили предложение определить структуру ref cursor посредством dbms_sql... :)
3. "Весь мир", может, и не сошелся, но далеко не всегда можно обойтись передачей текста запроса. Например, если данные нужны в методе, который работает от имени другого пользователя... Или метод - поставщик данных используется в иных приложениях и не может быть изменен по соображениям совместимости или по условиям лицензионного соглашения.
4. Я не буду говорить про чуждые Вам концепции инкапсуляции, соображения сопровождаемости или хотя бы банальную безопасность (поищите по форуму sql injection).

А кто сказал, что нужно передавать текст запроса? Разве я такое говорил? Передавать нужно лишь указатель на курсор - его номер. Это вы не очень то въехали. Инкапсуляция здесь не при чем. Это первое.

А второе - гон пурги это когда говорят зделать ничего нельзя можешь только кол-во строк узнать. Я же предложил решение проблемы. А человек сам разберется, что ему нужно
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33400448
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnatalexА кто сказал, что нужно передавать текст запроса? Разве я такое говорил?Вообще-то именно так был воспринят Ваш пост с текстом процедуры. Рад, что Вы изменили мнение. Anatalex
А второе - гон пурги это когда говорят зделать ничего нельзя можешь только кол-во строк узнать. Я же предложил решение проблемы.РЕШЕНИЕ предложил DenisPopov. Ваши же посты - решение какой-то совсем другой задачи Anatalex А человек сам разберется, что ему нужно
А вот это уж обязательно. Лишь бы те, кто будет давать советы "после нас", не апеллировали потом к Вашим предложениям определять структуру ref cursor посредством dbms_sql
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33400490
Anatalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous AnatalexА кто сказал, что нужно передавать текст запроса? Разве я такое говорил?Вообще-то именно так был воспринят Ваш пост с текстом процедуры. Рад, что Вы изменили мнение. Anatalex
А второе - гон пурги это когда говорят зделать ничего нельзя можешь только кол-во строк узнать. Я же предложил решение проблемы.РЕШЕНИЕ предложил DenisPopov. Ваши же посты - решение какой-то совсем другой задачи Anatalex А человек сам разберется, что ему нужно
А вот это уж обязательно. Лишь бы те, кто будет давать советы "после нас", не апеллировали потом к Вашим предложениям определять структуру ref cursor посредством dbms_sql

Если вы не поняли, так и не говорите. Я предлагал определить структуру курсора, неизвестной структуры с помощью dbms_sql для этого этот пакет и предназначен. Если вы хотите приплетать для этого яву, флаг вам в руки, но все эти вещи прекрасно решаются с помощью dbms_sql .
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33400570
Sxak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВопросикВопрос знающим людям:

Как прокрутить реф-курсор в цикле, если неизвестна его структура ?
Если тебе только прокрутить то может быть сгодится делать всегда 1е поле типа нумбер и выводить его в 1? тогда просто отфетсишь сколько надо
то есть все крсоры делать 'select 1 fiktivnoje_pole, ....'
а потом вроде можно делать фетч только в 1е поле
fetch ref_cur into tmp
и пофингу что там есть что-то дальше
al Antalex: Ты не понял. Пакет dbms_sql не умеет работать с реф_курсорами и преобразование из одного типа в другой невозможно. Я на еот форум пришел как раз с таким вопросом Мне так ответили со ссылкой на какой-то буржуинский сайт. Если знаешь как - напиши
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33400624
Anatalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sxak ВопросикВопрос знающим людям:

Как прокрутить реф-курсор в цикле, если неизвестна его структура ?
Если тебе только прокрутить то может быть сгодится делать всегда 1е поле типа нумбер и выводить его в 1? тогда просто отфетсишь сколько надо
то есть все крсоры делать 'select 1 fiktivnoje_pole, ....'
а потом вроде можно делать фетч только в 1е поле
fetch ref_cur into tmp
и пофингу что там есть что-то дальше
al Antalex: Ты не понял. Пакет dbms_sql не умеет работать с реф_курсорами и преобразование из одного типа в другой невозможно. Я на еот форум пришел как раз с таким вопросом Мне так ответили со ссылкой на какой-то буржуинский сайт. Если знаешь как - напиши

С реф курсорами он действительно не работает. Но можно определить ссылку на курсор любой структуры. Т.е. переменная будет не ref cursor. А будет ссылка (типа INTEGER) на курсор . С помощью этой ссылки в пакете dbms_sql можно из курсора получить все что угодно. Названия, типы, кол-во, значения полей и т.д. И эту ссылку можешь передавать куда угодно в пределах pl/sql из процедуры в процедуру пока курсор не закрыт. К какому полю какую переменную привязывать опять же можно динамически, типы то полей и их порядок определяются без проблем.
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33400768
ten
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnatalexНо можно определить ссылку на курсор любой структуры. Т.е. переменная будет не ref cursor. А будет ссылка (типа INTEGER) на курсор . С помощью этой ссылки в пакете dbms_sql можно из курсора получить все что угодно.

Хочется присоединиться к желающим посмотреть реализацию этой идеи. Вообще то dbms.define_column и dbms.desribe_columns работают после разбора выполненного dbms.parse. А для этого надо знать текст запроса, который будете разбирать.
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33400800
Anatalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ten AnatalexНо можно определить ссылку на курсор любой структуры. Т.е. переменная будет не ref cursor. А будет ссылка (типа INTEGER) на курсор . С помощью этой ссылки в пакете dbms_sql можно из курсора получить все что угодно.

Хочется присоединиться к желающим посмотреть реализацию этой идеи. Вообще то dbms.define_column и dbms.desribe_columns работают после разбора выполненного dbms.parse. А для этого надо знать текст запроса, который будете разбирать.

Так ведь, когда создается и открывается реф курсор его текст тоже известен. Почему вместо открытия реф курсора не распарсить его с помощью dbms_sql?
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #33400821
ten
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопросик Как прокрутить реф-курсор в цикле, если неизвестна его структура ?
ты решаешь не ту задачу (см. со слов "чтобы отказаться от ref cursor...")
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как прокрутить реф-курсор в цикле ?
    #35721986
Ewg_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сорри, не понял чем закончилось обсуждение темы.
столкнулся с проблемой аналогично автора темы, но немного проще:
процедуры возвращают открытые реф-курсоры.
можно ли узнать
а) нет ли там ошибки (ошибка будет на фетче, т.к. при открытии курсора запрос не выполняется)
б) число записей.
а фетч я сделать не могу, т.к. не знаю структуры

по описанию мне бы очень подошла функция DBMS_HS_PASSTHROUGH.FETCH_ROW
нет ли чего подобного для анализа Oracle-курсора ?

brant2000 получить данные из курсора неизвестной структуры в PL/SQL нельзя, только количество записей. и как ?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как прокрутить реф-курсор в цикле ?
    #39638164
ОкеанНадежды
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а можно ли без динамики открыть курсорную переменную из курсорА ?

что-то типа


open v_ref_dat for c_all_list;

, где c_all_list - описанный выше курсор

зачем надо?
результирующий набор селекта одинаковый, а немного различаются фильтры. Не хочется прям внутри блока прописывать, хотела в секции объявлений описать все вариантры курсоров, чтобы не прыгать потом по всей проге и искать
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #39638171
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОкеанНадеждыа можно ли без динамики открыть курсорную переменную из курсорА ?И с динамикой нельзя.
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #39638175
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicОкеанНадеждыа можно ли без динамики открыть курсорную переменную из курсорА ?И с динамикой нельзя.
????
https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_sql.htm#CHDJDGDG
ни разу не использовал, нужды не было. Но вроде по описанию то, что надо
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #39638183
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОкеанНадежды хотела в секции объявлений описать все вариантры курсоров, чтобы не прыгать потом по всей проге и искать
Покажите пожалуйста способ, которым Вы предполагаете выбирать конкретный вариант курсора.
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #39638186
ОкеанНадежды
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousОкеанНадежды хотела в секции объявлений описать все вариантры курсоров, чтобы не прыгать потом по всей проге и искать
Покажите пожалуйста способ, которым Вы предполагаете выбирать конкретный вариант курсора.

да он не работает,

я хотела что-то типа

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
-- цель- одну курсорную переменную открыть из разных запросов 
-- в зависимости от условий

-- желательно в команду открытия не передавать select  в виде плохо отлаживаемой текстовой строки
-- или огромного селекта посреди проги
declare
  cursor c is(
    select 1 from dual);
  cursor b is(
    select 2 from dual);

  n number;
  type t is ref cursor;
  t_cur t;
begin
  -- как-то манипулируем с n

  if n = 1 then
    open t for c;
  else
    open t for b;
  end if;

  loop
    fetch rc
      into < куда - нить записали >;
    exit when rc%notfound;
  end loop;

  close t;
end;
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #39638187
ОкеанНадежды
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ой, только там не rc,а t разумеется
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #39638190
ОкеанНадежды
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
точнее не t, а t_cur :))
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #39638192
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОкеанНадежды[src pl/sql] if n = 1 then
open t for c;
else
open t for b;
end if;
[/src]
В таком варианте все, что Вам надо, это объявить курсоры varchar2-переменными. :)
Проверку структуры возвращаемого результата можно оформить посредством объявления strong ref cursor.

Рассмотрите еще такой вариант:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
declare
  -- Атрибуты фильтра
  l_NumFilter1 number := 1;
  l_DateFilterStart date := date'2018-04-28';
  l_DateFilterStop date := date'2018-04-29';
  -- Общий курсор. Критически важно: каждый вариант запроса в списке union all 
  -- должен сравнивать значение _параметра с константой.
  -- это позволит оптимизатору отсекать (не выполнять) ненужные ветки плана.
  cursor c_common (p_variant varchar2) is  with t(id, dt_eventDate, num_Attr) as (select rownum, date'2018-04-25'+rownum, mod(rownum,10) from dual connect by level < 10)
      select * 
        from t 
       where p_variant = 'useDateFilterSet' 
         and dt_eventDate between l_DateFilterStart and l_DateFilterStop
    union all 
      select * 
        from t 
       where p_variant = 'useAttrFilterSet' 
         and num_Attr = l_NumFilter1
    ;
begin
  dbms_output.put_line('FilterSet1');
  for i in c_common ('useDateFilterSet') loop
    dbms_output.put_line(i.id||'. dt_eventDate='||to_char(i.dt_eventDate,'yyyy-mm-dd')||', num_Attr='||i.num_Attr);
  end loop;
  dbms_output.put_line('FilterSet2');
  for i in c_common ('useAttrFilterSet') loop
    dbms_output.put_line(i.id||'. dt_eventDate='||to_char(i.dt_eventDate,'yyyy-mm-dd')||', num_Attr='||i.num_Attr);
  end loop;
end;
/

FilterSet1
3. dt_eventDate=2018-04-28, num_Attr=3
4. dt_eventDate=2018-04-29, num_Attr=4
FilterSet2
1. dt_eventDate=2018-04-26, num_Attr=1
PL/SQL procedure successfully completed

SQL> 
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #39638193
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И да, есть еще один очевидный способ - варианты запроса можно оформить статикой посредством перегрузки функций, возвращающих курсор.
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #39638205
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousИ да, есть еще один очевидный способ - варианты запроса можно оформить статикой посредством перегрузки функций, возвращающих курсор.
Например, так (ни разу не догма):
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
declare
  l_NumFilter1 number := 7;
  l_DateFilterStart date := date'2018-04-28';
  l_DateFilterStop date := date'2018-04-29';

  -- Просто определим структуру записи
  -- Этот курсор НЕ используется для получения данных
  cursor c_rec is  with t(id, dt_eventDate, num_Attr1, num_Attr2) as (select rownum, date'2018-04-25'+rownum, rownum+1, rownum*7  from dual connect by level < 10)
      select * from t where 1=0
    ;
  type t_cur is ref cursor return c_rec%rowtype; -- Strong ref cursor позволяет легко обращаться к полям записи из PL/SQL 

  -- Перегруженные геттеры (варианты курсора)
  -- Первый параметр геттера - фейк, просто для выбора варианта перегруженной функции 
  -- если таких функций будет много, использовать одни только сочетания параметров для формирования уникальной сигнатуры 
  -- может оказаться неудобно.
  -- 1. По дате
  function get_dataset(by_DtRange number, p_dt_from date, p_dt_to date) return t_cur is
    l_cur t_cur;
  begin
    open l_cur for with t(id, dt_eventDate, num_Attr1, num_Attr2) as (select rownum, date'2018-04-25'+rownum, rownum+1, rownum*7  from dual connect by level < 10)
        select * from t where dt_eventDate between p_dt_from and p_dt_to
    ;
    return l_cur;
  end;

  -- 2. По атрибуту 1
  function get_dataset(by_Attr1 number, p_attr number) return t_cur is
    l_cur t_cur;
  begin
    open l_cur for with t(id, dt_eventDate, num_Attr1, num_Attr2) as (select rownum, date'2018-04-25'+rownum, rownum+1, rownum*7  from dual connect by level < 10)
        select * from t where num_Attr1 = p_attr
    ;
    return l_cur;
  end;

  -- 3. По атрибуту 2
  function get_dataset(by_Attr2 number, p_attr number) return t_cur is
    l_cur t_cur;
  begin
    open l_cur for with t(id, dt_eventDate, num_Attr1, num_Attr2) as (select rownum, date'2018-04-25'+rownum, rownum+1, rownum*7  from dual connect by level < 10)
        select * from t where num_Attr2 = p_attr
    ;
    return l_cur;
  end;

  -- Универсальный обработчик
  procedure process_dataset(p_dataset t_cur) is
    l_row c_rec%rowtype;
  begin
    if not p_dataset%isopen then return; end if;
    loop
      fetch p_dataset into l_row;
      exit when p_dataset%notfound;
      dbms_output.put_line(l_row.id||'. dt_eventDate='||to_char(l_row.dt_eventDate,'yyyy-mm-dd')||', num_Attr1='||l_row.num_Attr1||', num_Attr2='||l_row.num_Attr2);
    end loop;
    close p_dataset;
  end;
begin
  -- Зовем в разных вариациях.
  dbms_output.put_line('FilterSet1');
    process_dataset(get_dataset(by_DtRange=>1, p_dt_from=>l_DateFilterStart, p_dt_to=>l_DateFilterStop));

  dbms_output.put_line('FilterSet2');
    process_dataset(get_dataset(by_Attr1=>1, p_attr=>l_NumFilter1));

  dbms_output.put_line('FilterSet3');
    process_dataset(get_dataset(by_Attr2=>1, p_attr=>l_NumFilter1));
end;
/

FilterSet1
3. dt_eventDate=2018-04-28, num_Attr1=4, num_Attr2=21
4. dt_eventDate=2018-04-29, num_Attr1=5, num_Attr2=28
FilterSet2
6. dt_eventDate=2018-05-01, num_Attr1=7, num_Attr2=42
FilterSet3
1. dt_eventDate=2018-04-26, num_Attr1=2, num_Attr2=7
PL/SQL procedure successfully completed

...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #39638213
ОкеанНадежды
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей, спасибо!


про varchar2 - писала выше, что не хотелось бы динамики. Второй вариант интересный :)

хотя у меня вообще-то пока всего 2 курсора на выбор, можно проще их просто в открытии переменной да и прописать
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #39638412
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОкеанНадеждызачем надо?
результирующий набор селекта одинаковый, а немного различаются фильтры. Не хочется прям внутри блока прописывать, хотела в секции объявлений описать все вариантры курсоров, чтобы не прыгать потом по всей проге и искать
Если в реальности именно так и
ОкеанНадеждыя хотела что-то типа

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
-- цель- одну курсорную переменную открыть из разных запросов 
-- в зависимости от условий

-- желательно в команду открытия не передавать select  в виде плохо отлаживаемой текстовой строки
-- или огромного селекта посреди проги
declare
  cursor c is(
    select 1 from dual);
  cursor b is(
    select 2 from dual);

  n number;
  type t is ref cursor;
  t_cur t;
begin
  -- как-то манипулируем с n

  if n = 1 then
    open t for c;
  else
    open t for b;
  end if;

  loop
    fetch rc
      into < куда - нить записали >;
    exit when rc%notfound;
  end loop;

  close t;
end;




то данная тема избыточна - достаточно использовать 1 курсор, в котором будут применены все фильтры подобным образом:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
declare
  cursor c (n2 number) is with cte1(num, s, s2) as 
(select 1, 'qw', null from dual
union all
select 2,'zx', 'n' from dual
union all
select 5,'qw', 'a' from dual)
select num, s, s2 from cte1 
where (s2 is null and n2=1) 
or (s='zx' and n2=2) 
or (num =5 and n2=3);

  n number;

begin
  -- как-то манипулируем с n

open c(n);
  loop
    fetch c
      into < куда - нить записали >;
    exit when c%notfound;
  end loop;

  close c;
end;
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #39638428
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_sql.htm#CHDJDGDG
ни разу не использовал, нужды не было. Но вроде по описанию то, что надоИ где там что-нибудь про PL/SQL-ный курсор?
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #39638917
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОкеанНадеждыandrey_anonymousпропущено...

Покажите пожалуйста способ, которым Вы предполагаете выбирать конкретный вариант курсора.

да он не работает,

я хотела что-то типа

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
-- цель- одну курсорную переменную открыть из разных запросов 
-- в зависимости от условий

-- желательно в команду открытия не передавать select  в виде плохо отлаживаемой текстовой строки
-- или огромного селекта посреди проги
declare
  cursor c is(
    select 1 from dual);
  cursor b is(
    select 2 from dual);

  n number;
  type t is ref cursor;
  t_cur t;
begin
  -- как-то манипулируем с n

  if n = 1 then
    open t for c;
  else
    open t for b;
  end if;

  loop
    fetch rc
      into < куда - нить записали >;
    exit when rc%notfound;
  end loop;

  close t;
end;



імхо, Ваш варіант из доки
https://blogs.oracle.com/oraclemagazine/working-with-cursors
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
Code Listing 2: Block and description of the names_for function, which returns a cursor variable

1  CREATE OR REPLACE FUNCTION names_for (
 2        name_type_in IN VARCHAR2)
 3     RETURN SYS_REFCURSOR
 4  IS
 5     l_return   SYS_REFCURSOR;
 6  BEGIN
 7     CASE name_type_in
 8        WHEN 'EMP'
 9        THEN
10           OPEN l_return FOR
11                SELECT last_name
12                  FROM employees
13              ORDER BY employee_id;
14        WHEN 'DEPT'
15        THEN
16           OPEN l_return FOR
17                SELECT department_name
18                  FROM departments
19              ORDER BY department_id;
20     END CASE;
21
22     RETURN l_return;
23  END names_for;



зы
вместо
type t is ref cursor;
t_cur t;
писал t_cur sys_refcursor; меньше буковок
.....
stax
...
Рейтинг: 0 / 0
53 сообщений из 53, показаны все 3 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как прокрутить реф-курсор в цикле ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]