Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как передать значение NULL bind-переменной в DBMS_SQLTUNE.CREATE_TUNING_TASK? / 4 сообщений из 4, страница 1 из 1
09.07.2020, 07:58
    #39977696
rushchel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать значение NULL bind-переменной в DBMS_SQLTUNE.CREATE_TUNING_TASK?
Не могу передать NULL, получаю ORA-01008: не все переменные привязаны. Есть ли решение?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
declare
  v_result varchar2(100);
begin
  v_result := dbms_sqltune.create_tuning_task(
    sql_text   => 'select * from dual where 1 = :b1 and 2 = :b2 and (:b3 is null or 3 = :b3)'
   ,bind_list  => sql_binds(anydata.ConvertNumber(1),anydata.ConvertNumber(2),anydata.ConvertNumber(null))
   ,time_limit => 60
   ,task_name  => 'tt_my_task'
  );
  v_result := dbms_sqltune.execute_tuning_task(task_name => 'tt_my_task');
end;
/
select dbms_sqltune.report_tuning_task('tt_my_task') from dual;
begin dbms_sqltune.drop_tuning_task('tt_my_task'); end;
/


Код: 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.
SQL> select banner from v$version
  2  /

BANNER
--------------------------------------------------------------------------------
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production

SQL> declare
  2    v_result    varchar2(100);
  3  begin
  4    v_result := dbms_sqltune.create_tuning_task(
  5      sql_text   => 'select * from dual where 1 = :b1 and 2 = :b2 and (:b3 is null or 3 = :b3)'
  6     ,bind_list  => sql_binds(anydata.ConvertNumber(1),anydata.ConvertNumber(2),anydata.ConvertNumber(null))
  7     ,time_limit => 60
  8     ,task_name  => 'tt_my_task'
  9    );
 10    v_result := dbms_sqltune.execute_tuning_task(task_name => 'tt_my_task');
 11  end;
 12  /

SQL> select dbms_sqltune.report_tuning_task('tt_my_task') from dual
  2  /

DBMS_SQLTUNE.REPORT_TUNING_TAS
--------------------------------------------------------------------------------
GENERAL INFORMATION SECTION
-------------------------------------------------------------------------------
Tuning Task Name   : tt_my_task
Tuning Task Owner  : SYSTEM
Workload Type      : Single SQL Statement
Scope              : COMPREHENSIVE
Time Limit(seconds): 60
Completion Status  : COMPLETED
Started at         : 07/09/2020 07:32:39
Completed at       : 07/09/2020 07:33:31
-------------------------------------------------------------------------------
Schema Name: SYSTEM
SQL ID     : dp45w53chrvyu
SQL Text   : select * from dual where 1 = :b1 and 2 = :b2 and (:b3 is null or
             3 = :b3)
Bind Variables :
 1 -  (NUMBER):1
 2 -  (NUMBER):2
-------------------------------------------------------------------------------
ERRORS SECTION
-------------------------------------------------------------------------------
- ORA-01008: не все переменные привязаны
-------------------------------------------------------------------------------
...
Рейтинг: 0 / 0
09.07.2020, 10:40
    #39977718
SQL*Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать значение NULL bind-переменной в DBMS_SQLTUNE.CREATE_TUNING_TASK?
Привязка идет не по именам переменных, а по порядку.
У вас тут четыре переменных.
Поэтому и привязать надо четыре значения
Код: plsql
1.
2.
3.
4.
5.
,bind_list  => sql_binds(
   anydata.ConvertNumber(1)
 , anydata.ConvertNumber(2)
 , anydata.ConvertNumber(null)
 , anydata.ConvertNumber(null))


P.S. Если ставить после запятых пробел, текст будет удобнее читать, а значит и ошибок будет меньше! :-)
...
Рейтинг: 0 / 0
09.07.2020, 12:09
    #39977739
SQL*Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать значение NULL bind-переменной в DBMS_SQLTUNE.CREATE_TUNING_TASK?
Проверил на Oracle Database EE 19.7.
Работает.

Листинг выполнения
Код: 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.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
SQL> SET ECHO ON;
SQL> SET LONG 1000000;
SQL> SET SERVEROUTPUT ON;
SQL> 
SQL> declare
  2    v_result    varchar2(100);
  3  begin
  4  dbms_output.put_line('-- BEGIN --');
  5     dbms_sqltune.drop_tuning_task(task_name  => 'tt_my_task');
  6     v_result := dbms_sqltune.create_tuning_task(
  7       sql_text   => 'select * from dual where 1 = :b1 and 2 = :b2 and (:b3 is null or 3 = :b3)'
  8     , bind_list  => sql_binds(
  9          anydata.ConvertNumber(1), anydata.ConvertNumber(2)
 10        , anydata.ConvertNumber(NULL), anydata.ConvertNumber(NULL) )
 11     , time_limit => 60
 12     , task_name  => 'tt_my_task');
 13  dbms_output.put_line('1-'||v_result);
 14    v_result := dbms_sqltune.execute_tuning_task(task_name => 'tt_my_task');
 15  dbms_output.put_line('2-'||v_result);
 16  end;
 17  /
-- BEGIN --
1-tt_my_task
2-EXEC_47


PL/SQL procedure successfully completed.

SQL> select dbms_sqltune.report_tuning_task('tt_my_task') from dual
  2  /

DBMS_SQLTUNE.REPORT_TUNING_TASK('TT_MY_TASK')                                   
--------------------------------------------------------------------------------
GENERAL INFORMATION SECTION
-------------------------------------------------------------------------------
Tuning Task Name   : tt_my_task
Tuning Task Owner  : LUX
Workload Type      : Single SQL Statement
Scope              : COMPREHENSIVE
Time Limit(seconds): 60
Completion Status  : COMPLETED
Started at         : 07/09/2020 11:35:00
Completed at       : 07/09/2020 11:35:10


DBMS_SQLTUNE.REPORT_TUNING_TASK('TT_MY_TASK')                                   
--------------------------------------------------------------------------------
-------------------------------------------------------------------------------
Schema Name   : LUX
Container Name: VSU_LUX
SQL ID        : dp45w53chrvyu
SQL Text      : select * from dual where 1 = :b1 and 2 = :b2 and (:b3 is null
                or 3 = :b3)
Bind Variables: :
 1 -  (NUMBER):1
 2 -  (NUMBER):2

-------------------------------------------------------------------------------

DBMS_SQLTUNE.REPORT_TUNING_TASK('TT_MY_TASK')                                   
--------------------------------------------------------------------------------
There are no recommendations to improve the statement.

-------------------------------------------------------------------------------



P. S. Конечно, вы понимаете, что легальное использование этих программ требует лицензирования Diagnostics Pack и Tuning Pack ?!
...
Рейтинг: 0 / 0
09.07.2020, 13:33
    #39977764
rushchel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать значение NULL bind-переменной в DBMS_SQLTUNE.CREATE_TUNING_TASK?
SQL*Plus, понял. Спасибо!
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как передать значение NULL bind-переменной в DBMS_SQLTUNE.CREATE_TUNING_TASK? / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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