我尝试将以下内容设为动态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.
答案 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变量的引用实际上都是绑定变量。
答案 3 :(得分:1)
我还得到了以下解释,与上述答案相关:
你必须使用连接(服用 关注SQL注入风险 疗程)。
首先,改变会话集事件 需要一个字符串文字。确实如此 不支持表达式,其中绑定 可以使用变量。
其次,您尝试使用绑定变量 在字符串文字内(嵌入在 另一个字符串文字)。捆绑 变量不是SQL * Plus 替换变量(& var或 &安培;&安培; VAR)。替代变量是 在解析之前由SQL * Plus应用 他们不认识任何SQL 句法。他们可以在任何地方出现 任何声明。它们适用于 客户端不在服务器中。
但是主机绑定变量是SQL语法 元素。他们被允许为 操作数(具有特定的SQL数据 在DML中的表达式中查询 和PL / SQL匿名块。他们是 不允许在DDL或会话控制中 语句。