3

在对执行立即和错误处理的各种问题进行了大约两个小时的研究之后,我认为我没有遇到我即将提出的问题。我已将我的问题简化为下面的示例。问题是:

当我使用变量中的创建文本和创建文本中的语法错误以立即模式执行过程创建时,执行立即调用会引发错误,指示它失败。但我无法理解潜在的错误或其文本。

但是,当我直接在 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)错误?

4

2 回答 2

2

当您show errors自己运行时,它将显示 sqlplus 本身所做的任何先前“创建”/“更改”的错误,这在这种情况下什么都没有(因为由于动态 SQL,它对 sqlplus 隐藏了)

您必须明确地说您想查看此案例的程序错误:

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>

由于创建运行服务器端而不是通过 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>
于 2013-03-25T23:12:24.437 回答
0

您不能在 PL/SQL 中使用 select 1 from dual...。必须使用 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;
/
于 2013-03-25T20:49:09.443 回答