在对执行立即和错误处理的各种问题进行了大约两个小时的研究之后,我认为我没有遇到我要提出的问题。我已将问题减少到下面的示例。问题是:
当我执行一个过程以立即模式创建时,变量中的创建文本和创建文本中的语法错误,执行立即调用会抛出一个错误,指示它失败。但我无法得到潜在的错误或其文本。
但是,当我在sqlplus(没有中间模式)中直接创建相同的proc时,得到错误的效果非常好。
那么,如何解决导致立即模式失败的错误?
我在输出中散布了我的评论(MOP)并减少了空白行数:
SQL*Plus: Release 10.2.0.1.0 - Production on Mon Mar 25 15:57:06 2013
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> set serveroutput on
SQL> declare
2 eSQL varchar(568);
3 begin
4 eSQL := 'create or replace procedure MOPMOP
5 as
6 begin
7 select 1 from dual;
8 end;
9 ';
10 execute immediate eSQL;
11 end;
12 /
ERROR:
ORA-24344: success with compilation error
ORA-06512: at line 10
Warning: PL/SQL compilation errors.
这很好。有一个编译错误。那么,现在让我问一下编译错误是什么:
SQL> show errors;
No errors.
这不好。有一个编译错误。它以前如何!?!?!?与之对比:
SQL> create or replace procedure MOPMOP
2 as
3 begin
4 select 1 from dual;
5 end;
6 /
Warning: Procedure created with compilation errors.
这很好。有一个编译错误。那么,现在让我问一下编译错误是什么:
SQL> show errors;
Errors for PROCEDURE MOPMOP:
LINE/COL ERROR
-------- -----------------------------------------------------------------
4/5 PLS-00428: an INTO clause is expected in this SELECT statement
SQL>
这很好。有一个编译错误。现在我知道它是什么了。
那么,如何让中间模式吐出底层(00428)错误?
答案 0 :(得分:2)
当你自己运行show errors
时,它会显示sqlplus本身所做的任何先前的“创建”/“更改”的错误,这种情况是没有的(因为它是从sqlplus隐藏的,因为它动态SQL)
你必须明确表示你想看到这种情况的程序错误:
SQL> declare
2 eSQL varchar(568);
3 begin
4 eSQL := 'create or replace procedure MOPMOP
5 as
6 begin
7 select 1 from dual;
8 end;
9 ';
10 execute immediate eSQL;
11 end;
12 /
ERROR:
ORA-24344: success with compilation error
ORA-06512: at line 10
Warning: PL/SQL compilation errors.
SQL> show errors procedure mopmop
Errors for PROCEDURE MOPMOP:
LINE/COL ERROR
-------- -----------------------------------------------------------------
4/5 PLS-00428: an INTO clause is expected in this SELECT statement
SQL>
作为create ran服务器端而不是通过sqlplus,sqlplus不知道失败,因此无法正确获取错误。
如果您之前遇到过失败,也会保留:
SQL> create or replace procedure MOPMOP2
2 as
3 begin
4 select 1 from dual;
5 end;
6 /
Warning: Procedure created with compilation errors.
SQL> declare
2 eSQL varchar(568);
3 begin
4 eSQL := 'create or replace procedure MOPMOP
5 as
6 begin
7 select 1 from dual;
8 end;
9 ';
10 execute immediate eSQL;
11 end;
12 /
ERROR:
ORA-24344: success with compilation error
ORA-06512: at line 10
Warning: PL/SQL compilation errors.
SQL> show errors
Errors for PROCEDURE MOPMOP2:
LINE/COL ERROR
-------- -----------------------------------------------------------------
4/5 PLS-00428: an INTO clause is expected in this SELECT statement
SQL>
答案 1 :(得分:0)
您不能在PL / SQL中使用双重选择1。必须使用select into。在这两种情况下,您都在创建PL / SQL过程而不是某些SQL脚本。
declare
x number;
begin
select 1 into x from dual;
end;
/
declare
procedure MOPMOP
as
x number;
begin
select 1 into x from dual;
dbms_output.put_line(x);
end MOPMOP;
begin
MOPMOP;
end;
/
避免使用ORA-24344 - 尽管我可能永远不会使用动态sql:
declare
eSQL varchar(568);
x number;
begin
eSQL := 'create or replace procedure MOPMOP as
begin
select 1 into x from dual;
end;';
execute immediate eSQL;
EXCEPTION WHEN OTHERS THEN NULL;
end;
/