即時実行とエラー処理に関するさまざまな問題について約 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) エラーを吐き出すにはどうすればよいでしょうか?