powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как прокрутить реф-курсор в цикле ?
25 сообщений из 53, страница 1 из 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
25 сообщений из 53, страница 1 из 3
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как прокрутить реф-курсор в цикле ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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