2017-08-22 75 views
5

PL khối/SQL dưới đây không như mong đợi:Tại sao dbms_sql.parse chứa khối PL/SQL sai với các biến liên kết thành công bất ngờ?

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 

Bởi vì tôi không có một thủ tục gọi là DONTEXIST. Câu hỏi của tôi là tại sao khối PL/SQL tiếp theo này hoàn tất thành công?

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. 

Sự khác biệt là sử dụng biến liên kết thay vì hằng số, nhưng tôi muốn biết tại sao điều này tạo nên sự khác biệt.

Đây là Oracle 12.1.0.2

+0

Có 'dbms_sql.parse (i, 'bắt đầu dbms_output.put (' 'a' '); kết thúc;', 1);' thành công không? –

+0

Có thành công. –

+2

Có vẻ như một lỗi đối với tôi. – APC

Trả lời

4

Hình như các phân tích chỉ là cú pháp cho các khối anon với với phím tắt, và kiểm tra ngữ nghĩa đầy đủ được hoãn lại cho đến thực hiện.

Tuy nhiên, đó không phải là hành vi mà chúng tôi muốn để lỗi 26669757 được nâng lên.

Các vấn đề liên quan