如何在Oracle动态SQL中转义“:”并且还有绑定变量?

时间:2011-04-03 18:30:27

标签: sql oracle escaping

我尝试将以下内容设为动态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月4日中部标准时间下午5点10分编辑,增加以下内容:

更改会话不是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 个答案:

答案 0 :(得分:4)

对于这个陈述,我忘了使用绑定变量,例如:

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;
/

答案 1 :(得分:3)

您不能将绑定变量与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

此外,您没有收到此有意义的错误消息,因为:字符已在您的语句中转义,因为它们位于引号(')之间。

答案 2 :(得分:1)

您不能将绑定变量与DDL一起使用。对于PL / SQL中的DML,您不能使用绑定变量,因为在将值连接到SQL语句时会自动应用它们。每个对PL / SQL变量的引用实际上都是绑定变量。

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

答案 3 :(得分:1)

我还得到了以下解释,与上述答案相关:

  

你必须使用连接(服用   关注SQL注入风险   疗程)。

     

首先,改变会话集事件   需要一个字符串文字。确实如此   不支持表达式,其中绑定   可以使用变量。

     

其次,您尝试使用绑定变量   在字符串文字内(嵌入在   另一个字符串文字)。捆绑   变量不是SQL * Plus   替换变量(& var或   &安培;&安培; VAR)。替代变量是   在解析之前由SQL * Plus应用   他们不认识任何SQL   句法。他们可以在任何地方出现   任何声明。它们适用于   客户端不在服务器中。

     

但是主机绑定变量是SQL语法   元素。他们被允许为   操作数(具有特定的SQL数据   在DML中的表达式中查询   和PL / SQL匿名块。他们是   不允许在DDL或会话控制中   语句。