PL/SQLプログラムおよびJavaストアド・プロシージャのデバッグについて
JDeveloperでは、単一のIDEツールでPL/SQLおよびJavaストアド・プロシージャのデバッグをサポートしています。PL/SQLをデバッグする場合、デバッグするソース・コードがOracleデータベースに格納されている必要があります。Javaストアド・プロシージャの場合、ソース・コードがJDeveloperプロジェクト内にあり、コンパイル済コードがデータベースにデプロイされる必要があります。
また、デバッグ処理の開始方法は、ローカル・デバッグとリモート・デバッグのどちらを実行するかで異なります。PL/SQLをデバッグする場合、開始方法の違いは次のとおりです。
- ローカル・デバッグ: JDeveloperによって、デバッグするプログラム(デバッグ対象プロセス)が自動的に起動され、デバッガがプログラムにアタッチされます。
- リモート・デバッグ: SQL*Plus、Dbms_Job、OCIプログラム、トリガー起動などのOracleクライアントでデバッグするプログラムを手動で起動する必要があります。その後、データベースのデバッグ対象プロセスからJDeveloperのデバッガへの接続を確立する必要があります。デバッグ対象プロセスが開始し、JDeveloperのデバッガがプロセスにアタッチされた後は、リモート・デバッグとローカル・デバッグの動作はよく似ています。
PL/SQLおよびJavaストアド・プロシージャのデバッグ情報は、スマート・データ・ウィンドウ、データ・ウィンドウ、監視式ウィンドウ、インスペクタ・ウィンドウ、スタック・ウィンドウおよびクラス・ウィンドウなどの、様々なJDeveloperデバッガ・ウィンドウで表示されます。スレッド・ウィンドウ、ヒープ・ウィンドウおよびモニター・ウィンドウは、PL/SQLコードのデバッグ時には使用できません。デバッガが生成するデバッグ情報についての説明を表示するには、[F1]を押すか、デバッガ・ウィンドウで「ヘルプ」をクリックしてください。
PL/SQLをデバッグする場合、監視式ウィンドウおよびインスペクタ・ウィンドウでPL/SQL式を使用できます。また、mytable(i*10)
のような表要素へのアクセスを含む条件付きブレークポイントも使用できます。この機能には、ファンクション、プロシージャ、パッケージおよびパッケージ本体で宣言された表も含まれます。
このトピックには、ローカルおよびリモートのPL/SQLプログラムとJavaストアド・プロシージャを、Oracleデータベースでデバッグする場合に適用される次のような情報が含まれます。
JDeveloperでデバッグ可能なPL/SQLオブジェクト
デバッグできるのは、PL/SQLをコールするPL/SQLプログラム、Javaストアド・プロシージャをコールするPL/SQL(Oracle9iリリース2のデータベースのみ)、およびトリガーを起動するSQL文を発行するPL/SQLプログラムです。
PL/SQLのデバッグは、次のオブジェクトから開始できます。
- スタンドアロン・プロシージャ
- スタンドアロン・ファンクション
- パッケージ済プロシージャ
- パッケージ済ファンクション
その他のPL/SQLオブジェクトは、前提条件を満たし、前述のいずれかから開始された場合のみ、トレースできます。
トリガー、Javaストアド・プロシージャおよびOracleオブジェクト型のデバッグについて
トリガー、Javaストアド・プロシージャおよびOracleオブジェクト型をデバッグする際には、次に点を考慮してください。
- これらのオブジェクトに対するデバッグは開始できませんが、これらのオブジェクトに達することは可能です。たとえば、トリガーのデバッグは開始できませんが、レコードを追加するプロシージャはデバッグできます。トリガーをデバッグするには、トリガー内にブレークポイントを設定し、トリガーを起動させるプロシージャをデバッグします。デバッガはブレークポイントで停止します。
- Javaストアド・プロシージャのデバッグおよびトレース実行は、Oracle9iリリース2のデータベースのみでサポートされています。また、これらのプロシージャがJDeveloperプロジェクトに含まれ、そのソースがOracleデータベースでデプロイされたものと一致する必要があります。Javaストアド・プロシージャをデバッグするには、Javaストアド・プロシージャ内にブレークポイントを設定し、Javaストアド・プロシージャをコールするPL/SQLをデバッグします。あるいは、PL/SQLをデバッグし、Javaストアド・プロシージャをトレース実行することもできます。
サポートされているOracleデータベースでのデバッグ情報の表示内容
Oracle9iリリース2以上のデータベースに存在するPL/SQLコードのデバッグでは、デバッガによって、データベースの新規JPDA(Java Platform Debugger Architecture)実装が使用されます。JPDAはJavaのデバッグの業界標準で、データベースでのJPDA実装は、JavaおよびPL/SQLのシームレスなデバッグを可能にします。Oracle8iまたはOracle9iリリース1のデータベースに存在するコードのデバッグでは、デバッガによって、異なるAPI(DBMS_DEBUG
パッケージ)が使用されます。このAPIを使用した場合、デバッガ・ウィンドウには詳細な情報が表示されません。
PL/SQLコードからのデバッグ情報がJDeveloperデバッガ・ウィンドウでどのように表示されるかは、使用するデータベースのバージョンによって異なります。JDeveloperのコード・エディタでのPL/SQLコードの編集は、データベースのバージョンにかかわらず同じです。
Oracle8iまたはOracle9iリリース1とOracle9iリリース2のデータベースでのデバッグの違い
Oracle8iリリース8.1.7またはOracle9iリリース1のデータベースのデバッグとOracle9iリリース2のデータベースのデバッグの主な違いは次のとおりです。
- Javaストアド・プロシージャのデバッグは、Oracle9iリリース2のデータベースでのみサポートされています。
- Oracle8iまたはOracle9iリリース1のデータベースでは、NUMBERおよびVARCHAR2などのスカラー・データ型が、単一の展開できないエントリとして、データ・ウィンドウおよび監視式ウィンドウに表示されます。Oracle9iリリース2のデータベースでは、すべてのデータ型(スカラーを含む)が、展開できるエントリとして表示されます。
- Oracle8iまたはOracle9iリリース1のデータベースでは、コンポジット・データ型へのアクセスが制限されています。詳細は、次の「既知の問題」を参照してください。
- Oracle8iまたはOracle9iリリース1のデータベースでは、「プロジェクト」->「プロジェクトの設定」 - 「デバッガ」で指定される、「対象とするクラス/パッケージのリスト」および「対象外のクラス/パッケージのリスト」のエントリは使用されません。
既知の問題
次に、Oracle8iまたはOracle9iリリース1のデータベースに対するデバッグの際に発生する問題を示します。これらは古いAPIの制限であり、修正されません。
コンポジット・データ型
データ・ウィンドウ、監視式ウィンドウおよびインスペクタ・ウィンドウなどのJDeveloperのデータ関連ウィンドウでは、NUMBERや VARCHAR2などのスカラー型である変数が表示できます。また、次のような複雑な型も表示されます。
- CURSOR
- 表示される値により、フラグ、行カウントおよびknlフラグが示されます。
- RECORD
- デバッガはレコード全体を表示できません。ただし、監視式ウィンドウまたはインスペクタ・ウィンドウで式を入力し、レコードの指定のフィールドを参照できます。たとえば、
my_rec.my_field
のように入力します。
- TABLE of <scalar>
- デバッガにより、(Javaストアド・プロシージャでの配列の表示と類似した)フォルダが表示されます。フォルダを開くと、要素を参照できます。フォルダを右クリックし、「範囲の調整」を選択すると、フォルダを開いたときに表示されるインデックスの範囲を入力できます。デフォルトの範囲は1から100です。範囲に含まれるインデックスが多いほど(表内にインデックスの要素が存在しない場合でも)、フォルダを開くのに時間がかかります。
- TABLE of <composite>
- デバッガにより、(Javaストアド・プロシージャでの配列の表示と類似した)フォルダが表示されます。フォルダを開いても、デバッガによって要素が表示されない場合があります。これには表の表も含まれます。
その他の注意点
- (リモート・デバッグまたは「対象とするクラス/パッケージのリスト」および「対象外のクラス/パッケージのリスト」の設定のために)デバッグの動作を設定する場合、「プロジェクト」->「プロジェクトの設定」 - 「デバッガ」パネルでプロジェクトのデバッガ設定にアクセスするため、アクティブなワークスペースおよびプロジェクトが必要です。
- Oracle9iリリース2のデータベースでは、次のコマンドがデバッグ対象プログラムのセッションをデバッガに接続するために使用されます。
jdwp_debug_session.tcp_connect (host_name, port)
.
ローカル・デバッグでは、JDeveloperによりこのコマンドが発行されます。リモート・デバッグでは、デバッグするPL/SQLのコールに使用するのと同じセッションで、このコマンドを発行する必要があります。
- 監視式ウィンドウに式を入力する際、ローカル変数は
v_value
またはV_Value
のように、大文字と小文字のどちらで入力してもかまいません。パッケージ変数も大文字と小文字が区別されませんが、変数名に付く接頭辞は、大文字と小文字が区別されます。次に例を示します。
$Oracle.Package.SCOTT.MY_PACKAGE.g_var
監視式ウィンドウにパッケージを追加する最も簡単な方法は、データ・ウィンドウから変数をドラッグ・アンド・ドロップするか、クラス・ウィンドウからパッケージをドラッグ・アンド・ドロップすることです。
関連項目
Javaプログラムのリモート・デバッグについて
デバッグ中のコード内の移動