Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Повисание dbms_sql.fetch_rows / 18 сообщений из 18, страница 1 из 1
28.06.2010, 07:15
    #36710631
aleksandy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повисание dbms_sql.fetch_rows
Есть такого вида динамический запрос.
Код: 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
28.06.2010, 08:31
    #36710653
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повисание dbms_sql.fetch_rows
aleksandyПочему выполнить запрос получается (dbms_sql.execute(cursorId); dtlm проходит), а считать результаты - нет?STFF что делает select на стадии execute?
...
Рейтинг: 0 / 0
29.06.2010, 07:18
    #36712314
aleksandy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повисание dbms_sql.fetch_rows
Elic,

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

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

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

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

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

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

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

JaRoПросто на всякий случай - Вы знаете, что это, скажем так, неоптимально?
Знаю, но см. выше.
...
Рейтинг: 0 / 0
29.06.2010, 11:09
    #36712654
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повисание dbms_sql.fetch_rows
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
29.06.2010, 13:50
    #36713165
tpd20
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повисание dbms_sql.fetch_rows
env,

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

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

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

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

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

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


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