Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / как открыть один курсор дважды? / 24 сообщений из 24, страница 1 из 1
14.12.2016, 08:42
    #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
14.12.2016, 08:48
    #39366367
israelshamir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как открыть один курсор дважды?
israelshamir,

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

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



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

pipe row (

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

.....
stax

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

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

Какую задачу решает такая конструкция?
...
Рейтинг: 0 / 0
14.12.2016, 10:08
    #39366432
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как открыть один курсор дважды?
Xdredd.vl1) правильно говорить "у Вас" и именно с большой буквы, так как именно это приемлемая форма обращения к незнакомому человеку.Это твоё право, иметь своё мнение. Главное, не будь навязчивым.
...
Рейтинг: 0 / 0
14.12.2016, 10:17
    #39366453
Xdredd.vl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как открыть один курсор дважды?
Elic, ок, так же как и твое право быть не воспитанным уродом, который правила хорошего тона считает просто чьим-то мнением.
...
Рейтинг: 0 / 0
14.12.2016, 10:30
    #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
14.12.2016, 15:35
    #39366947
д0kХ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как открыть один курсор дважды?
stax..israelshamirXdredd.vl,

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

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

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

.....
stax

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


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

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

.....
stax

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

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


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

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

.....
stax

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

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


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