为什么dbms_sql.parse包含带有绑定变量的错误PL / SQL块意外成功?

时间:2017-08-22 07:35:56

标签: oracle plsql bind-variables

下面的PL / SQL块按预期失败:

SQL> declare
  2    i int;
  3  begin
  4    i := dbms_sql.open_cursor;
  5    dbms_sql.parse(i,'begin dontexist; dbms_output.put(''a''); end;',1);
  6    dbms_sql.close_cursor(i);
  7  end;
  8  /
declare
*
FOUT in regel 1:
.ORA-06550: Regel 1, kolom 7:
PLS-00201: identifier 'DONTEXIST' must be declared.
ORA-06550: Regel 1, kolom 7:
PL/SQL: Statement ignored.
ORA-06512: in "SYS.DBMS_SQL", regel 1120
ORA-06512: in regel 5

因为我没有名为DONTEXIST的程序。我的问题是为什么下一个PL / SQL块成功完成?

SQL> declare
  2    i int;
  3  begin
  4    i := dbms_sql.open_cursor;
  5    dbms_sql.parse(i,'begin dontexist; dbms_output.put(:a); end;',1);
  6    dbms_sql.close_cursor(i);
  7  end;
  8  /

PL/SQL-procedure is geslaagd.

区别在于使用bind变量而不是常量,但我想知道为什么会有所不同。

这是Oracle 12.1.0.2

1 个答案:

答案 0 :(得分:4)

看起来解析只是带有绑定的匿名块的语法,并且完整的语义检查会延迟到执行。

尽管如此,这不是我们想要的行为所以Bug 26669757已经提出。