Как избежать ":" в Oracle динамического SQL, а также иметь переменные связывания? - PullRequest
7 голосов
/ 03 апреля 2011

Я пытаюсь сделать следующий динамический SQL, но символ : портится -

alter session set events 'sql_trace [sql: asasasaass]';

Пример:

declare
 l_trc_cmd   varchar2(500);
 l_sql_id    varchar2(500) := 'asasasaass';
begin
  l_trc_cmd     := q'# alter session set events 'sql_trace [sql: :L_SQL_ID]' #';
  execute immediate l_trc_cmd using l_sql_id;
end;
/

Сбой выше с:

ERROR at line 1:
ORA-01006: bind variable does not exist

Один : требуется согласно синтаксису SQL, а другой : - для переменной связывания.

Есть идеи, как это исправить, кроме конкатенации значения связывания?

- Отредактировано 4 апреля в 17.10 CST, чтобы добавить следующее:

Изменить сеанс нельзяКоманда DDL.Ниже доказательство.

sqlplus+> select * from t2;

         A
----------
         1

1 row selected.

sqlplus+> insert into t2 values(2);

1 row created.

sqlplus+> alter session set tracefile_identifier ="umappsperf1" statistics_level=all;

Session altered.

sqlplus+> alter session set events 'sql_trace wait=true';

Session altered.

sqlplus+> select * from t2;

         A
----------
         2
         1

2 rows selected.

sqlplus+> rollback;

Rollback complete.

sqlplus+> select * from t2;

         A
----------
         1

1 row selected.

Ответы [ 4 ]

4 голосов
/ 04 апреля 2011

Для этого утверждения я бы просто забыл об использовании переменной связывания, например ::

declare
 l_trc_cmd   varchar2(500);
 l_sql_id    varchar2(500) := 'asasasaass';
begin
  l_trc_cmd := REPLACE(
    q'# alter session set events 'sql_trace [sql: %SQLID%]' #'
    ,'%SQLID%',l_sql_id);
  execute immediate l_trc_cmd;
end;
/
3 голосов
/ 04 апреля 2011

Нельзя использовать переменные связывания с DDL:

SQL> exec execute immediate 'CREATE TABLE test AS SELECT :x t FROM DUAL' USING 1;

ORA-01027: bind variables not allowed for data definition operations
ORA-06512: at line 2

Кроме того, вы не получите это осмысленное сообщение об ошибке, поскольку символы : в вашем выражении уже экранированы, поскольку они заключены в кавычки (').

1 голос
/ 05 апреля 2011

Мне также дали следующее объяснение, которое коррелирует с ответами выше:

Вы должны использовать конкатенацию (конечно, заботясь о рисках внедрения SQL).

Во-первых,Для событий события alter session требуется строковый литерал.Он не поддерживает выражения, в которых можно использовать переменную связывания.

Во-вторых, вы пытаетесь использовать переменную связывания внутри строкового литерала (встроенного в другой строковый литерал).Переменные связывания не являются переменными подстановки SQL * Plus (& var или && var).Переменные подстановки применяются SQL * Plus перед любым анализом, и они не распознают синтаксис SQL.Они могут прийти в любом месте в любом заявлении.Они применяются на клиенте, а не на сервере.

Но переменные привязки хоста являются элементами синтаксиса SQL.Они допускаются как операнды (с определенным типом данных SQL) в выражениях в DML, запросах и анонимных блоках PL / SQL.Они не разрешены в DDL или операторах управления сеансом.

1 голос
/ 04 апреля 2011

Нельзя использовать переменные связывания с DDL.Используя DML в PL / SQL, вы также не можете использовать переменные связывания, потому что они автоматически применяются при объединении значений в операторы SQL.Каждая ссылка на переменную PL / SQL на самом деле является переменной связывания.

http://www.akadia.com/services/ora_bind_variables.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...