powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Повисание dbms_sql.fetch_rows
18 сообщений из 18, страница 1 из 1
Повисание dbms_sql.fetch_rows
    #36710631
aleksandy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть такого вида динамический запрос.
Код: 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.
...
sqlQuery( 0 )                    := 'SELECT <20 столбцов>';
sqlQuery(sqlQuery.LAST +  1 ) := 'FROM table0 RIGHT OUTER JOIN table1';
sqlQuery(sqlQuery.LAST +  1 ) := 'WHERE <условия0>';
IF <if-условие> THEN
  sqlQuery(sqlQuery.LAST +  1 ) := 'AND <условие 0>';
ELSE
  sqlQuery(sqlQuery.LAST +  1 ) := 'AND <условие 1>';
END IF;
sqlQuery(sqlQuery.LAST +  1 ) := 'UNION ALL';
sqlQuery(sqlQuery.LAST +  1 ) := 'SELECT <20 столбцов>';
sqlQuery(sqlQuery.LAST +  1 ) := 'FROM table0 LEFT OUTER JOIN table1';
sqlQuery(sqlQuery.LAST +  1 ) := 'WHERE <условия1>';
IF <if-условие> THEN
  sqlQuery(sqlQuery.LAST +  1 ) := 'AND <условие 2>';
ELSE
  sqlQuery(sqlQuery.LAST +  1 ) := 'AND <условие 3>';
END IF;
sqlQuery(sqlQuery.LAST +  1 ) := 'UNION ALL';
sqlQuery(sqlQuery.LAST +  1 ) := 'SELECT <20 столбцов>';
sqlQuery(sqlQuery.LAST +  1 ) := 'FROM table0 JOIN table1';
sqlQuery(sqlQuery.LAST +  1 ) := 'WHERE <условия2>';

cursorId := dbms_sql.open_cursor;
dbms_sql.parse(cursorId, sqlQuery, sqlQuery.FIRST, sqlQuery.LAST, FALSE, dbms_sql.native);
dbms_sql.bind_variable(cursorId, ':1', param1);
...
dbms_sql.define_column(cursorId,  1 , column1);
...
res := dbms_sql.execute(cursorId);
WHILE dbms_sql.fetch_rows(cursorId) >  0  LOOP
  ...
END LOOP;
...
При его выполнении, если <if-условие> выполняется, то все работает "на ура", но если <if-условие> не выполняется, тогда процедура виснет на этой строке
Код: plaintext
dbms_sql.fetch_rows(cursorId) >  0 
. Текст запроса, который хранится в sqlQuery, 100% выполнимый в обоих случаях. Проверял не раз.

В общем, что это за хрень??? Почему выполнить запрос получается (dbms_sql.execute(cursorId); dtlm проходит), а считать результаты - нет?
...
Рейтинг: 0 / 0
Повисание dbms_sql.fetch_rows
    #36710653
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleksandyПочему выполнить запрос получается (dbms_sql.execute(cursorId); dtlm проходит), а считать результаты - нет?STFF что делает select на стадии execute?
...
Рейтинг: 0 / 0
Повисание dbms_sql.fetch_rows
    #36712314
aleksandy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,

По ссылке
mcureenabЕсли на этом этапе согласованный набор данных получить не удаётся, операция рвёт
Т.е. я так понимаю должно быть какое-то исключение, или нет?
И как данные могут быть несогласованными, если:
1. table1 создается бувально несколькими секундами ранее, и после выполнения цикла дропается, т.е. каждый раз таблица пересоздается;
2. table0 никем не обновлялась(???), т.к. на схеме работаю только я и ничего подобного не делал.
...
Рейтинг: 0 / 0
Повисание dbms_sql.fetch_rows
    #36712497
Фотография JaRo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleksandy1. table1 создается бувально несколькими секундами ранее, и после выполнения цикла дропается, т.е. каждый раз таблица пересоздается;Просто на всякий случай - Вы знаете, что это, скажем так, неоптимально?
...
Рейтинг: 0 / 0
Повисание dbms_sql.fetch_rows
    #36712504
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleksandy,

Трассу снимите и посмотрите, что там у вас на самом деле. А вообще, не очень понятно, какой здесь сакральный смысл для применения динамики.
...
Рейтинг: 0 / 0
Повисание dbms_sql.fetch_rows
    #36712515
Фотография JaRo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
envА вообще, не очень понятно, какой здесь сакральный смысл для применения динамики.Прочитайте пункт 1 из предыдущего ответа автора, станет очевидно, почему пришлось с динамикой...
...
Рейтинг: 0 / 0
Повисание dbms_sql.fetch_rows
    #36712520
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleksandy
1. table1 создается бувально несколькими секундами ранее, и после выполнения цикла дропается, т.е. каждый раз таблица пересоздается;
2. table0 никем не обновлялась(???), т.к. на схеме работаю только я и ничего подобного не делал.

MS SQL Serve® style?
Про второе мы можем вам только верить на слово.
...
Рейтинг: 0 / 0
Повисание dbms_sql.fetch_rows
    #36712534
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaRo,

Уже прочитал, и всё равно уверен, что там динамика нафиг не нужна.
...
Рейтинг: 0 / 0
Повисание dbms_sql.fetch_rows
    #36712542
Фотография JaRo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
envУже прочитал, и всё равно уверен, что там динамика нафиг не нужна.Там не нужен пункт 1, динамика - просто неизбежное его следствие.
...
Рейтинг: 0 / 0
Повисание dbms_sql.fetch_rows
    #36712551
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaRo,

Я имел в виду, что не нужен весь этот цирк, т.е. create/drop + динамика.

оффтоп:
Имеется ли шанс увидеть премудрую деву на какой-либо (вне)очередной сходке форумчан?
...
Рейтинг: 0 / 0
Повисание dbms_sql.fetch_rows
    #36712566
aleksandy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env,

имя таблицы table0 заранее неизвестно, известна только структура, поэтому и динамика. Предупреждая возможные вопросы, отвечу, так сделано потому, что это кусок из процедуры импортирования данных за определенный период и имя таблицы содержит некое подобие timestamp-а, который выдергивается и далее используется в фильтре. Сделано так потому, что заказчика мы так привыкли...

JaRoПросто на всякий случай - Вы знаете, что это, скажем так, неоптимально?
Знаю, но см. выше.
...
Рейтинг: 0 / 0
Повисание dbms_sql.fetch_rows
    #36712654
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleksandy,

Даже если вам приходится создавать/убивать таблицы, динамика для запроса не нужна.
Overview of synonyms
TFMThis is advantageous because if the underlying object must be renamed or moved, then only the synonym must be redefined. Applications based on the synonym continue to function without modification.
Проверим?

Код: 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.
SQL> create view killme_v0 as select dummy from dual;

View created.

Elapsed:  00 : 00 : 00 . 89 
SQL> create synonym killme_s for killme_v0;

Synonym created.

SQL> select * from killme_s;

D
-
X

SQL> create or replace procedure killme_p as
   2    d varchar2( 20 );
   3   begin
   4    select wm_concat(dummy) into d from
   5     (select dummy from killme_v0
   6        union all
   7      select dummy from killme_s);
   8    dbms_output.put_line(d);
   9   end;
  10   /

Procedure created.
SQL> set serveroutput on
SQL> exec killme_p;
X,X

PL/SQL procedure successfully completed.

SQL> create view killme_v1 as select 'Y' dummy from dual union all select 'Z' from dual;

View created.

SQL> create or replace synonym killme_s for killme_v1;

Synonym created.

SQL> exec killme_p;
X,Y,Z

PL/SQL procedure successfully completed.
Но мы люди недоверчивые! Паадумаишь, процедура, с процедурой всякий сможет.... А пакет, пакет то, небось, поломается!!
Код: 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.
SQL> create or replace package killme_pkg as
   2   procedure killme_p;
   3   end;
   4   /

Package created.

SQL> create or replace package body killme_pkg as
   2    procedure killme_p as
   3     d varchar2( 20 );
   4    begin
   5     select wm_concat(dummy) into d from
   6      (select dummy from killme_v0
   7         union all
   8       select dummy from killme_s);
   9     dbms_output.put_line(d);
  10    end;
  11    end;
  12    /

Package body created.

SQL> exec killme_pkg.killme_p;
X,Y,Z

PL/SQL procedure successfully completed.

SQL> create view killme_v2 as select 'Y' dummy from dual union all select 'Q' from dual;

View created.

SQL> create or replace synonym killme_s for killme_v2;

Synonym created.

SQL> exec killme_pkg.killme_p;
X,Y,Q

PL/SQL procedure successfully completed.
Опаньки, не умер пакет. Можно сказать, даже не заметил, что "табличка" подменилась.
Так что единственное в чём тут может потребоваться динамика для вашего случая это для переопределения синонима.
...
Рейтинг: 0 / 0
Повисание dbms_sql.fetch_rows
    #36713165
tpd20
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env,

а что значит "не умер пакет"?
Просто ушел в invalid, при вызове перекомпилился.
Он точно также и без синонима будет работать.
...
Рейтинг: 0 / 0
Повисание dbms_sql.fetch_rows
    #36714428
aleksandy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env,

спасибо за подсказку. Попробую переделать на синонимы.

Только полностью от динамики-то не избавиться все равно, т.к. имя создаваемой таблицы каждый раз разное, а вьюшку-то для синонима придется пересоздавать. Или я чего-то недопонял?
...
Рейтинг: 0 / 0
Повисание dbms_sql.fetch_rows
    #36714580
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleksandy,

Мне было в лом создавать таблицы, поэтому пример на вьюхах.
Что вы подсунете под синоним - это сугубо ваше дело. Основная идея в уходе от динамики, путём использования одного синонима на ваши "сменные" таблицы.
...
Рейтинг: 0 / 0
Повисание dbms_sql.fetch_rows
    #36714587
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tpd20,

При вызове
Код: plaintext
create or replace synonym
пакет НЕ уходит в invalid.
Проверял давно на 9.2.0.8 и вчера на 11.1.0.7
...
Рейтинг: 0 / 0
Повисание dbms_sql.fetch_rows
    #36715319
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
envПри вызове
Код: plaintext
create or replace synonym
пакет НЕ уходит в invalid. А тело/процедура ? :)
...
Рейтинг: 0 / 0
Повисание dbms_sql.fetch_rows
    #36715380
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

А тело пакета уходит :)
И перекомпиливается.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Повисание dbms_sql.fetch_rows
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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