powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вопрос по команде dbms_sql.parse
9 сообщений из 9, страница 1 из 1
Вопрос по команде dbms_sql.parse
    #32155130
Фотография Eter Panji
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня есть несколько запросов которые я по очереди вызываю в
динамической сессии.
Если тот же запрос я отдам на компиляцию второй раз
будет ли он компилится так же как и в первый раз
или он разберется и не станет этого делать.

И вообще как сделать эту фичу чтобы таскать на выбор одним из нескольких запросов. Типы колонок совпадают. Поэтому жалко тратить время на парсинг и привязку выходных переменных.

Как нибудь можно один раз отпарсить каждый запрос и потом только выполнять их.
...
Рейтинг: 0 / 0
Вопрос по команде dbms_sql.parse
    #32155148
AI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А оракл сам так и делает. Иначе нет смысла в наличии library cache. При первом попадании текста запроса на сервер происходит hard parse с полным разбором, проверкой прав и построением дерева выполнения. При последующих попаданиях того же текста (в 9 еще и похожего текста) происходит soft parse, то есть проверка доступа и все, дальше запрос сразу выполняется по существующему плану. Бывает ситуации, когда план инвалидируется (изменились определения объектов) или просто выбрасывается (не хватает места в пуле). Тогда при появлении использованного уже запроса вновь происходит построение дерева выполнения. Ораклу все равно, используете вы динамический sql или нет.

Этот вопрос очень странно услышать от сертифицированного оракловского администратора.
...
Рейтинг: 0 / 0
Вопрос по команде dbms_sql.parse
    #32155154
Фотография Eter Panji
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот неправда ваша.
Сколько не запускай коменду
dbms_sql.parse
dbms_sql.parse
она всегда выполняется примерно одно и тоже немаленькое время,
даже запускать их подряд

Есть же возможность принудительно перекомпилировать объект,
вероятно она так и поступает и плевать ей на libruary_cache

Вот отсюда и вопрос
нужно ли открывать N динамических сессий или можно поколдовать и
высасывать всё через одну.
...
Рейтинг: 0 / 0
Вопрос по команде dbms_sql.parse
    #32155164
AI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверьте одинаковость текста запросов. Если он разный - используйте стандартную рекомендацию оракла использовать bind-переменные.
...
Рейтинг: 0 / 0
Вопрос по команде dbms_sql.parse
    #32155169
Фотография Eter Panji
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы что издеваетесь.
У меня запрос в переменной.
Код: 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.
      if NOT(dbms_sql.is_open(seq_curs_id)) then
         seq_curs_id:=dbms_sql.open_cursor;
      end if;
        vv_sql:= ' SELECT NVL(sa.dis_level,ts.dis_level) dis_level,ts.CON_LEVEL,disc_id,NVL(sa.CURR_ID,ts.curr_id) curr_id, ssh.subs_id, ssh.serv_id, ssh.trpl_id  ' || ' FROM   (select SH.SUBS_ID, SH.RLB_ID, SH.TRPL_ID, ssh.SERV_ID from SUBS_HISTORY SH, SUBS_SERV_HISTORY ssh '||' where SH.CLNT_ID = :CLNT_ID and sh.stime<= SYSDATE AND SYSDATE<sh.etime ' || ' AND sh.subs_id=ssh.subs_id  AND ssh.stime<= SYSDATE AND SYSDATE<ssh.etime ' || ' ) ssh, SUBS_AUTO sa,SERVICE s, ' || ' (SELECT ts.serv_id,ts.curr_id,ts.DIS_LEVEL,ts.con_level, ts.trpl_id, ts.rlb_id FROM TARIFF_SERVICE_LEVEL ts '||' WHERE ts.stime<= SYSDATE AND SYSDATE<ts.etime ) ts ' || ' WHERE  ssh.SERV_ID=sa.SERV_ID(+)  AND ssh.subs_id=sa.subs_id(+) ' || 'AND sa.stime<= SYSDATE AND SYSDATE<sa.etime ' || 'AND ssh.SERV_ID=ts.SERV_ID(+) ' || ' AND ssh.SERV_ID=s.serv_id AND ts.rlb_id=ssh.rlb_id AND ts.trpl_id=ssh.trpl_id ORDER BY dis_level DESC ' ;

 -- Время замеряется для разного количества строк здесь
 
      dbms_sql.parse(seq_curs_id, vv_sql, dbms_sql.v7);
      dbms_sql.parse(seq_curs_id, vv_sql, dbms_sql.v7);
      dbms_sql.parse(seq_curs_id, vv_sql, dbms_sql.v7);

    	dbms_sql.bind_variable(seq_curs_id,':CLNT_ID',V_CLNT_ID);
      	 dbms_sql.DEFINE_COLUMN(seq_curs_id, 1 ,V_DIS_LEVEL);        
      	 dbms_sql.DEFINE_COLUMN(seq_curs_id, 2 ,V_CON_LEVEL);        
      	 dbms_sql.DEFINE_COLUMN(seq_curs_id, 3 ,V_DISC_ID);        
      	 dbms_sql.DEFINE_COLUMN(seq_curs_id, 4 ,V_CURR_ID);        
      	 dbms_sql.DEFINE_COLUMN(seq_curs_id, 5 ,V_SUBS_ID);        
      	 dbms_sql.DEFINE_COLUMN(seq_curs_id, 6 ,V_SERV_ID);        
      	 dbms_sql.DEFINE_COLUMN(seq_curs_id, 7 ,V_TRPL_ID);      
      sql_result:=dbms_sql.execute(seq_curs_id);
      WHILE dbms_sql.fetch_rows(seq_curs_id)<> 0  
      LOOP
         ***
      END LOOP;      
      dbms_sql.close_cursor(seq_curs_id);

...
Рейтинг: 0 / 0
Вопрос по команде dbms_sql.parse
    #32155172
Фотография Eter Panji
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А использовать для разных запросов BIND_VARIABLE
я не могу там меняются ИМЕНА полей. :(
...
Рейтинг: 0 / 0
Вопрос по команде dbms_sql.parse
    #32155288
Lord-Ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Посмотрел в доке по dbms_sql.parse - явно конечно не сказано, но судя по приведенным там схемам обработки dbms_sql.parse парсит всегда заново. Твой пример это подтверждает.

Вот при EXECUTE IMMEDIATE не должно по идее парсить повторно.

Надо бы проверить, интересно будет.
...
Рейтинг: 0 / 0
Вопрос по команде dbms_sql.parse
    #32155495
Lazy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Странно, как вы проверяли
Конечно soft parse, как и сказал Al.
При EXECUTE IMMEDIATE будет тоже самое. На сколько я понимаю dbms_sql нужен для того чтобы не делать soft parse.

cid:=dbms_sql.open_cursor;
wNUM2:=10000;
for wNUM in 1..10000 loop
vv_sql:= 'select field1 from test where field1='||wNUM2;
dbms_sql.parse(cid, vv_sql,dbms_sql.native);
end loop;
ret:=dbms_sql.execute(cid);
dbms_sql.close_cursor(cid);

cid:=dbms_sql.open_cursor;
wNUM2:=10000;
for wNUM in 1..10000 loop
vv_sql:= 'select field1 from test where field1='||wNUM;
dbms_sql.parse(cid, vv_sql,dbms_sql.native);
end loop;
ret:=dbms_sql.execute(cid);
dbms_sql.close_cursor(cid);

PL/SQL procedure successfully completed.
Elapsed: 00:00:03.25
PL/SQL procedure successfully completed.
Elapsed: 00:00:14.00
...
Рейтинг: 0 / 0
Вопрос по команде dbms_sql.parse
    #32155655
Фотография Oracle X-pert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 AL Ty prav,no dlya usloviya Execute immediate.
2 Eter:Tvoya zadacha toge reshaetsya dostatochno correct
( parallel parse v multisession mode, pri etom vremya zaprosa rastet -T
nelineino)
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вопрос по команде dbms_sql.parse
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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