powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / как открыть один курсор дважды?
24 сообщений из 24, страница 1 из 1
как открыть один курсор дважды?
    #39366366
israelshamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго времени суток! Сильно не травите, мне приходится подстраиваться под уже существующую логику говнокода.

Есть курсор :

details is select <<много всего>> from <<много всего>> ;

объявлен он в pipeline функции. мне нужно дважды его открыть, т.е. запилить цикл в цикле.

Я делаю так:

for i in details loop

for j in details loop
....много говнокода....
end loop;
....много говнокода....
pipe row(....);
end loop;

Компилится все без ошибок, но что то идет не так, я получаю в результате пустое множество. Ткните носом, пожалуйста, в ошибку.
...
Рейтинг: 0 / 0
как открыть один курсор дважды?
    #39366367
israelshamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
israelshamir,

если объявляю еще один курсор с тем же телом и уже его открываю внутри первого, то все работает, но не хотелось бы дублировать и без того говнокод
...
Рейтинг: 0 / 0
как открыть один курсор дважды?
    #39366368
Xdredd.vl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
israelshamir,

Код: plsql
1.
  pipe row(<v_result_row>);



А где присвоение значений переменной <v_result_row> ?
...
Рейтинг: 0 / 0
как открыть один курсор дважды?
    #39366372
israelshamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Xdredd.vl,

pipe row (

udf_name
(
i.v1,
i.v2,
...
i.vn,
значение_посчитанное_во_внутреннем_курсоре
)
);
...
Рейтинг: 0 / 0
как открыть один курсор дважды?
    #39366377
Xdredd.vl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
israelshamir,
а вот это "значение_посчитанное_во_внутреннем_курсоре" аналитическими функциями в запросе никак не посчитать ?

А вот это "дважды открыть один курсор" вызывает легкий и не поддельный ужас ...
...
Рейтинг: 0 / 0
как открыть один курсор дважды?
    #39366379
israelshamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Xdredd.vl,

к сожалению, нет, иначе придется полностью переписать этот продукт творческого поноса. а курсор в принципе вызывает ужас
...
Рейтинг: 0 / 0
как открыть один курсор дважды?
    #39366380
israelshamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Xdredd.vl,

если на то пошло, как открыть его один раз и дважды пробежаться по нему?
...
Рейтинг: 0 / 0
как открыть один курсор дважды?
    #39366383
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
israelshamirесли на то пошло, как открыть его один раз и дважды пробежаться по нему?Нельзя в одну реку войти дважды.
Необходимость даже не была притянута за уши. Выглядит сага об XYZ.
...
Рейтинг: 0 / 0
как открыть один курсор дважды?
    #39366385
Xdredd.vl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
israelshamir,
Зачем бегать по курсору внутри него самого ?
(если в аргумент курсора не передается значение из него самого)
1) пробегаем один раз, аггрегируем что надо, запоминаем в переменную.
2) пробегаем второй раз уже с пайпом результата + переменная(п.1).

(если в аргумент курсора все-таки передается значение из него самого):
3.1) находим этого "гения"
3.2) долго пинаем ногами в живот
3.3) однозначно переписываем этот кусок кода.
...
Рейтинг: 0 / 0
как открыть один курсор дважды?
    #39366387
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Xdredd.vl3.1) находим этого "гения"Вам обоим перед критикой не менее двух раз смотреть в зеркало.
Опрометчиво считать говнокодом нечто только со слов такого же говнокодера. Ему всё, что не похоже на его собственное дерьмо, может таким казаться.
...
Рейтинг: 0 / 0
как открыть один курсор дважды?
    #39366392
israelshamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Xdredd.vl,

ладно, придется переписать шедевр. Спасибо за помощь.
...
Рейтинг: 0 / 0
как открыть один курсор дважды?
    #39366398
Xdredd.vl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ElicXdredd.vl3.1) находим этого "гения"Вам обоим перед критикой не менее двух раз смотреть в зеркало.
Опрометчиво считать говнокодом нечто только со слов такого же говнокодера. Ему всё, что не похоже на его собственное дерьмо, может таким казаться.

Двойное прочтение одного набора данных, говно-код по умолчанию, без вариантов.
А если второе чтение еще и во вложенном цикле из первого, то это "грандговнокод", ибо для каждого прочтения записи из набора будет перечитываться весь набор еще раз ...

Все что не решается в этом случае аналитикой и/или древовидным запросом, решается рекурсией (например обход какого-нибудь уж "хитровыделанного" дерева) или моделью ... а то что приведено в коде это извращение.
...
Рейтинг: 0 / 0
как открыть один курсор дважды?
    #39366407
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
israelshamirXdredd.vl,

если на то пошло, как открыть его один раз и дважды пробежаться по нему?

есть фича и пробежаться два раза, но на клиенте
не вижу ничего страшного открыть курсор два раза

зы
почему многие считают чужое сразу говнокодом
Вы что пишите идеально, поверте придратся можно всегда

.....
stax
...
Рейтинг: 0 / 0
как открыть один курсор дважды?
    #39366408
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Xdredd.vlДвойное прочтение одного набора данных, говно-код по умолчанию, без вариантов.
А если второе чтение еще и во вложенном цикле из первого, то это "грандговнокод", ибо для каждого прочтения записи из набора будет перечитываться весь набор еще раз ...Всё это неймётся сделать ТСу, и, следовательно, нет в исходном коде. У тебя слишком буйная фантазия, все "гении" - в зеркале.
Xdredd.vlВсе что не решается в этом случае аналитикой и/или древовидным запросом, решается рекурсией (например обход какого-нибудь уж "хитровыделанного" дерева) или моделью ... а то что приведено в коде это извращение.У тебя гипертрофированная фантазия о задаче. Как следствие много бесполезного шума.
...
Рейтинг: 0 / 0
как открыть один курсор дважды?
    #39366421
Xdredd.vl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,

1) правильно говорить "у Вас" и именно с большой буквы, так как именно это приемлемая форма обращения к незнакомому человеку.(если Вас этому не учили, то обратитесь к родителям за разъяснениями).
2) То что вы называете "гипертрофированное мнение" лишь принятие того что задача должна быть решена в общем виде так как не озвучено ограничений
3) Пока что в этой ветке бесполезный шум производите именно Вы (судя по количеству сообщений это Ваше любимое занятие).

На этом считаю наш с Вами диалог оконченным.
commit.
...
Рейтинг: 0 / 0
как открыть один курсор дважды?
    #39366427
Xdredd.vl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..israelshamirXdredd.vl,

если на то пошло, как открыть его один раз и дважды пробежаться по нему?

есть фича и пробежаться два раза, но на клиенте
не вижу ничего страшного открыть курсор два раза

зы
почему многие считают чужое сразу говнокодом
Вы что пишите идеально, поверте придратся можно всегда

.....
stax

А разве клиент не будет при этом каждый раз отправлять запрос на сервер и "тащить" данные ответа по сети? Всегда думал что лучше подготовить все и сразу на сервере и выдать за один раз клиенту.
...
Рейтинг: 0 / 0
как открыть один курсор дважды?
    #39366430
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
israelshamir,

Курсор параметризирован?

Какую задачу решает такая конструкция?
...
Рейтинг: 0 / 0
как открыть один курсор дважды?
    #39366432
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Xdredd.vl1) правильно говорить "у Вас" и именно с большой буквы, так как именно это приемлемая форма обращения к незнакомому человеку.Это твоё право, иметь своё мнение. Главное, не будь навязчивым.
...
Рейтинг: 0 / 0
как открыть один курсор дважды?
    #39366453
Xdredd.vl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic, ок, так же как и твое право быть не воспитанным уродом, который правила хорошего тона считает просто чьим-то мнением.
...
Рейтинг: 0 / 0
как открыть один курсор дважды?
    #39366462
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
israelshamir,

Если задача позволяет такие изменения, я бы код сдобрил коллекциями, как в примере ниже, или GTT, если память в дефиците.
Код: 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.
SQL> declare
  2    type num_tbl_type is table of int;
  3    l_inner_tbl num_tbl_type := num_tbl_type();
  4    l_outer_tbl num_tbl_type := num_tbl_type();
  5    l_first boolean := true;
  6    cursor details_csr
  7    is
  8    select xmlcast(column_value as int) n
  9  	 from xmltable('1, 2 to 3');
 10    procedure put( p_what int, x_tbl in out nocopy num_tbl_type)
 11    is
 12    begin
 13  	 x_tbl.extend;
 14  	 x_tbl(x_tbl.count):=p_what;
 15    end put;
 16    procedure process( p_outer int, p_inner int)
 17    is
 18    begin
 19  	 dbms_output.put_line(
 20  	   utl_lms.format_message( 'outer=%s inner=%s', to_char(p_outer), to_char(p_inner)));
 21    end process;
 22  begin
 23    for d_rec in details_csr
 24    loop <<outer>>
 25  	 put( d_rec.n, l_outer_tbl);
 26  	 put( d_rec.n, l_inner_tbl);
 27  	 for i in 1..cardinality(l_inner_tbl)
 28  	 loop <<inner>>
 29  	   process( d_rec.n, l_inner_tbl(i));
 30  	 end loop inner;
 31  	 if not l_first
 32  	 then
 33  	   for j in reverse 1..l_outer_tbl.count-1
 34  	   loop <<outer_backward>>
 35  	     process( l_outer_tbl(j), d_rec.n);
 36  	   end loop outer_backward;
 37  	 else
 38  	   l_first := false;
 39  	 end if;
 40    end loop outer;
 41  end;
 42  /
outer=1 inner=1                                                                 
outer=2 inner=1                                                                 
outer=2 inner=2                                                                 
outer=1 inner=2                                                                 
outer=3 inner=1                                                                 
outer=3 inner=2                                                                 
outer=3 inner=3                                                                 
outer=2 inner=3                                                                 
outer=1 inner=3                                                                 

PL/SQL procedure successfully completed.

...
Рейтинг: 0 / 0
как открыть один курсор дважды?
    #39366947
д0kХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..israelshamirXdredd.vl,

если на то пошло, как открыть его один раз и дважды пробежаться по нему?

есть фича и пробежаться два раза, но на клиенте
не вижу ничего страшного открыть курсор два раза

зы
почему многие считают чужое сразу говнокодом
Вы что пишите идеально, поверте придратся можно всегда

.....
stax

Предполагается , что между 2 проходами,
в даные попадающих под предикат
никто другой ничего свежего не закомитит.
собственно есть 2 варианта - сериализейбл либо dbms_lock,
с соотвествующими последствиями.
А хочется и рыбку и ...
...
Рейтинг: 0 / 0
как открыть один курсор дважды?
    #39366963
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Xdredd.vlstax..пропущено...


есть фича и пробежаться два раза, но на клиенте
не вижу ничего страшного открыть курсор два раза

зы
почему многие считают чужое сразу говнокодом
Вы что пишите идеально, поверте придратся можно всегда

.....
stax

А разве клиент не будет при этом каждый раз отправлять запрос на сервер и "тащить" данные ответа по сети? Всегда думал что лучше подготовить все и сразу на сервере и выдать за один раз клиенту.
я не использовал, врать не буду, но знающие говорят что на клиента тянется раз
я о Scrollable Cursors - Oracle

......
stax
...
Рейтинг: 0 / 0
как открыть один курсор дважды?
    #39366970
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
д0kХstax..пропущено...


есть фича и пробежаться два раза, но на клиенте
не вижу ничего страшного открыть курсор два раза

зы
почему многие считают чужое сразу говнокодом
Вы что пишите идеально, поверте придратся можно всегда

.....
stax

Предполагается , что между 2 проходами,
в даные попадающих под предикат
никто другой ничего свежего не закомитит.
собственно есть 2 варианта - сериализейбл либо dbms_lock,
с соотвествующими последствиями.
А хочется и рыбку и ...
read only

.....
stax
...
Рейтинг: 0 / 0
как открыть один курсор дважды?
    #39366976
NETClient
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
д0kХПредполагается , что между 2 проходами,
в даные попадающих под предикат
никто другой ничего свежего не закомитит.
собственно есть 2 варианта - сериализейбл либо dbms_lock,
с соотвествующими последствиями.
А хочется и рыбку и ...
Мой друг, опять ты все мешаешь в кучу. Если действительно надо, чтобы никто ничего не закоммитил, то только lock table/dbms_lock.
Если же всего лишь требуется двумя запросами прочитать одно и тоже, то lock не нужен. И даже serializable использовать необязательно - есть еще ретроспективные запросы, при условии, что в другой сессии не будут выполнены truncate или drop.
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / как открыть один курсор дважды?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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