Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как прокрутить реф-курсор в цикле ? / 25 сообщений из 53, страница 1 из 3
24.11.2005, 16:27
    #33397901
Вопросик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прокрутить реф-курсор в цикле ?
Вопрос знающим людям:

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

то есть

open ref_c;

loop
fetch ref_c into ... -- куда ??? как объявить переменную для рекорда этого
-- курсора ??? Кол-во столбцов и их типы неизвестны,
-- (реф-курсор приходит из другой процедуры PL/SQL)
exit when ref_c%notfound;
..............
..............
end loop;
...
Рейтинг: 0 / 0
24.11.2005, 16:28
    #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
24.11.2005, 16:31
    #33397927
brant2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прокрутить реф-курсор в цикле ?
for i in ref_c loop
...
end loop;
...
Рейтинг: 0 / 0
24.11.2005, 16:39
    #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
24.11.2005, 16:50
    #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
24.11.2005, 16:55
    #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
24.11.2005, 17:06
    #33398107
alex-ls
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прокрутить реф-курсор в цикле ?
ВопросикА если приблизиться к суровой реальности ?

а структура курсора меняется? Или он стабилен все же?
...
Рейтинг: 0 / 0
24.11.2005, 17:17
    #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
24.11.2005, 17:17
    #33398156
Вопросик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прокрутить реф-курсор в цикле ?
alex-ls ВопросикА если приблизиться к суровой реальности ?

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

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

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

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

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

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

К сожалению, меняется....
мда... тогда не знаю если бы не менялся можно было бы объявить курсор в пакете и по нему стряпать переменные. А так...
...
Рейтинг: 0 / 0
24.11.2005, 17:31
    #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
24.11.2005, 17:33
    #33398215
Вопросик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прокрутить реф-курсор в цикле ?
блин опять тороплюсь ...

XCur вместо с1.
...
Рейтинг: 0 / 0
24.11.2005, 17:37
    #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
24.11.2005, 17:42
    #33398248
brant2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прокрутить реф-курсор в цикле ?
Вопросикблин опять тороплюсь ...

XCur вместо с1.
Как не называй получить данные из курсора неизвестной структуры в PL/SQL нельзя, только количество записей.
...
Рейтинг: 0 / 0
24.11.2005, 19:03
    #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
24.11.2005, 20:17
    #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
24.11.2005, 20:44
    #33398638
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прокрутить реф-курсор в цикле ?
ВопросикК сожалению, меняется....
Реф-курсор формируется программно и кол-во колонок в нем зависит от данных.
может быть так
наименование банк 1 банк2 ........банкN
Бумага 20 30 650
кол-во банков меняется в соответсвии с кучей параметров и сколько их будет, заранее не определить.О, так Ваш курсор имеет вполне предсказуемую структуру?
Тогда можно попробовать методом "научного втыка":
- насоздавать N рекордов с различным числом полей
- пытаться по очереди профетчить в каждый из рекордов, пока не попадешь в нужный
...
Рейтинг: 0 / 0
25.11.2005, 10:38
    #33399255
Anatalex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прокрутить реф-курсор в цикле ?
andrey_anonymous ВопросикК сожалению, меняется....
Реф-курсор формируется программно и кол-во колонок в нем зависит от данных.
может быть так
наименование банк 1 банк2 ........банкN
Бумага 20 30 650
кол-во банков меняется в соответсвии с кучей параметров и сколько их будет, заранее не определить.О, так Ваш курсор имеет вполне предсказуемую структуру?
Тогда можно попробовать методом "научного втыка":
- насоздавать N рекордов с различным числом полей
- пытаться по очереди профетчить в каждый из рекордов, пока не попадешь в нужный

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


Передавай не сам реф курсор, а номер курсора определенный с помощью того же dbms_sql и будет тебе счастье
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как прокрутить реф-курсор в цикле ? / 25 сообщений из 53, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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