3

即時実行とエラー処理に関するさまざまな問題について約 2 時間の調査を行った後、私が提示しようとしている問題に正確に遭遇したとは思いません。問題を以下のサンプルに縮小しました。問題は次のとおりです。

変数内の作成テキストと作成テキスト内の構文エラーを使用してプロシージャ create を即時モードで実行すると、即時実行呼び出しが失敗したことを示すエラーをスローします。しかし、根本的なエラーやそのテキストを理解できません。

ただし、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>

create は 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

select 1 from dual... は PL/SQL では使用できません。select into を使用する必要があります。どちらの場合も、SQL スクリプトではなく PL/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 に答える