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