为什么 dbms_sql.parse 包含不正确的 PL/SQL 块与绑定变量意外成功?
Why does dbms_sql.parse containing incorrect PL/SQL block with bind variables succeed unexpectedly?
下面的 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.
不同之处在于使用绑定变量而不是常量,但我想知道为什么这会有所不同。
这是 Oracle 12.1.0.2
看起来解析只是针对带有绑定的匿名块的语法,并且完整的语义检查被推迟到执行。
不过,这不是我们想要的行为,因此提出了错误 26669757。
下面的 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.
不同之处在于使用绑定变量而不是常量,但我想知道为什么这会有所不同。
这是 Oracle 12.1.0.2
看起来解析只是针对带有绑定的匿名块的语法,并且完整的语义检查被推迟到执行。
不过,这不是我们想要的行为,因此提出了错误 26669757。