この章では、PL/SQLとJavaストアド・プロシージャの実行およびデバッグ方法について説明します。
この章には次の項が含まれます:
Javaストアド・プロシージャは、データベース内に存在し、データベース内で実行されるJavaメソッドです。ストアド・プロシージャは実行可能な形態でRDBMSに格納され、クライアント・メモリー領域ではなくRDBMSメモリー領域で実行されます。このため、ストアド・プロシージャを使用するとデータベース・アプリケーションのパフォーマンスを改善できます。
Javaクラスをデータベースにデプロイする際、ストアド・プロシージャとしてPL/SQLに公開するメソッドを選択できます。メソッドはパッケージとしてまとめてデプロイすることも、個別にデプロイすることもできます。
JDeveloperでは、PL/SQLプログラム・ユニットを実行およびデバッグできます。たとえば、ファンクションから渡されるパラメータや戻り値を指定して、実行内容をより厳密に制御し、テスト対象の詳細を出力できます。
注意: Oracleデータベース内のプロシージャまたはファンクションは、スタンドアロンの場合とパッケージ化されている場合があります。 |
ファンクション、プロシージャおよびパッケージを実行またはデバッグするには、次のようにします。
「ウィンドウ」→「データベース」→「データベース」ウィンドウを選択します。
「IDE接続」またはアプリケーションを展開し、データベース接続を選択します。
スキーマを開き、デバッグ対象に応じて、該当するノード(「プロシージャ」、「ファンクション」または「パッケージ本体」)を開きます。
(デバッグ時のみのオプション)デバッグ対象のオブジェクトのノードを右クリックし、ポップアップ・メニューから「デバッグ用にコンパイル」を選択します。これにより、INTERPRETED
モードのPL/SQLプログラムがコンパイルされます。
(デバッグ時のみのオプション)デバッグ対象のファンクション、プロシージャまたはパッケージを選択し、ダブルクリックしてエディタで開きます。
(デバッグ時のみのオプション)マージンの左側をクリックしてPL/SQLコード内にブレークポイントを設定します。
注意: ブレークポイントは、実行可能なコード行に設定する必要があります。デバッガが停止しない場合は、ブレークポイントが実行可能なコード行に設定されていない可能性があります(ブレークポイントが検証済であることを確認してください)。 |
エディタまたは「データベース」ウィンドウ内のプロシージャが選択されていることを確認します。
「デバッグ」をクリックするか、デバッグせずに実行する場合は「実行」をクリックします。
「PL/SQLの実行」ダイアログが表示されます。
デバッグするプロシージャまたはファンクションの名前である「ターゲット」を選択します。ターゲットを変更すると、「パラメータ」および「PL/SQLブロック」ボックスの内容が動的に変化することがわかります。
注意: ターゲットを選択できるのは、複数のプログラム・ユニットを含むパッケージを実行またはデバッグするように選択した場合のみです。 |
「パラメータ」ボックスに、ターゲットの引数が表示されます(適用可能な場合)。
「PL/SQLブロック」ボックスに、選択したターゲットに対してJDeveloperで生成されたカスタム・コードが表示されます。ファンクションまたはプロシージャの内容によっては、プロシージャ、ファンクションまたはパッケージに渡されるように、NULL値を妥当な値に置き換える操作が必要になることがあります。引数として渡される値を初期化するために追加コードの記述が必要なこともあります。この場合は、PL/SQLブロックのテキストを必要に応じて編集できます。
「OK」をクリックしてターゲットを実行またはデバッグします。
「ログ」ウィンドウに表示される出力情報を分析します。ファンクションの場合、戻り値が表示されます。DBMS_OUTPUT
メッセージも表示されます。
JDeveloperデバッガでは、Javaプログラムをデバッグするのみでなく、Oracleデータベース内のPL/SQLプログラムおよびJavaストアド・プロシージャもデバッグできます。
JDeveloperでは、PL/SQLとJavaストアド・プロシージャのデバッグをどちらも1つのIDEツールでサポートしています。PL/SQLをデバッグする場合は、デバッグ対象のソース・コードがOracleデータベースに格納されている必要があります。Javaストアド・プロシージャの場合は、ソース・コードをJDeveloperプロジェクト内に置き、コンパイル後のコードをデータベースにデプロイする必要があります。
また、デバッグ・アクションの開始方法は、ローカル・デバッグとリモート・デバッグのどちらを実行するかに応じて異なります。PL/SQLをデバッグする場合、開始方法の違いは次のとおりです。
ローカル・デバッグ - JDeveloperでは、自動的にデバッグ対象のプログラム(デバッグ・プロセス)が起動され、そのプログラムにデバッガがアタッチされます。
リモート・デバッグ - SQL*PlusなどのOracleクライアント、OCIプログラムであるDbms_Jobまたはトリガー起動を使用して、デバッグ対象のプログラムを手動で起動する必要があります。その後、データベース・デバッグ・プロセスからJDeveloperデバッガへの接続を確立します。デバッグ対象プロセスが開始し、JDeveloperのデバッガがプロセスにアタッチされた後は、リモート・デバッグとローカル・デバッグの動作はよく似ています。
PL/SQLおよびJavaストアド・プロシージャのデバッグ情報は、「スマート・データ」、「データ」、「監視式」、「インスペクタ」、「スタック」および「クラス」など、各種のJDeveloperデバッガ・ウィンドウに表示されます。
「スレッド」ウィンドウ、「ヒープ」ウィンドウおよび「モニター」ウィンドウは、PL/SQLコードのデバッグ時には利用できません。
PL/SQLのデバッグ時に、mytable(i*10)のような表要素へのアクセスなど、条件ブレークポイントのみでなく、ユーザーは「監視式」および「インスペクタ」ウィンドウでPL/SQL式を使用できます。この機能には、ファンクション、プロシージャ、パッケージおよびパッケージ本体で宣言される表が含まれます。
PL/SQLをコールするPL/SQLプログラム、Javaストアド・プロシージャをコールするPL/SQL (Oracle9iリリース2以降のデータベース)、トリガーを起動するSQL文を発行するPL/SQLプログラムをデバッグできます。
次のオブジェクトからPL/SQLのデバッグを開始できます。
スタンドアロン・プロシージャ
スタンドアロン・ファンクション
パッケージ済プロシージャ
パッケージ済ファンクション
他のPL/SQLオブジェクトも、前提条件を満たしており、前述のいずれかから起動されるPL/SQLオブジェクトであれば、すべてトレースできます。詳細は、第29.3.3項「PL/SQLおよびJavaストアド・プロシージャのデバッグの前提条件」を参照してください。
トリガー、Javaストアド・プロシージャおよびOracleオブジェクト型のデバッグ時の考慮事項は、次のとおりです。
この種のオブジェクトのデバッグは開始できませんが、この種のオブジェクトのトレースは実行できます。たとえば、トリガーのデバッグは開始できませんが、レコードを追加するプロシージャはデバッグできます。トリガーをデバッグするには、トリガーにブレークポイントを設定してから、トリガーを起動させるプロシージャをデバッグします。デバッガは、設定したブレークポイントで停止します。
Javaストアド・プロシージャのデバッグとステップ実行がサポートされているのは、Oracle9iリリース2以降のデータベースです。これらのプロシージャをJDeveloperプロジェクトに含めることと、ソースにOracleデータベース内でのデプロイ内容との一貫性があることが必要です。Javaストアド・プロシージャをデバッグするには、その中にブレークポイントを設定してから、Javaストアド・プロシージャをコールするPL/SQLをデバッグします。また、PL/SQLをデバッグしてJavaストアド・プロシージャをステップ実行することも可能です。
デバッガは、データベースのJPDA (Java Platform Debugger Architecture)実装を使用します。JPDAはJavaデバッグの業界標準であり、データベースのJPDA実装によりJavaとPL/SQLをシームレスにデバッグできます。
必知事項
デバッグ動作を構成する場合(リモート・デバッグのため、またはクラスの対象リストおよび対象外リストの設定のため)、「アプリケーション」→「プロジェクト・プロパティ - 実行/デバッグ/プロファイル」ページでプロジェクトのデバッガ設定にアクセスするにはアクティブなアプリケーションおよびプロジェクトが必要です。
次のコマンドを使用して、デバッグ・セッションをデバッガに接続します。
DBMS_DEBUG_JDWP.CONNECT_TCP( <host_name>, <port> )
ローカル・デバッグの場合は、このコマンドがJDeveloperにより発行されます。リモート・デバッグの場合は、このコマンドをデバッグ対象のPL/SQLのコールに使用するのと同じセッションで発行する必要があります。
「監視式」ウィンドウに式を入力するときに、v_value
やV_Value
のように、大/小文字を区別せずにローカル変数を入力できます。パッケージ変数にも大/小文字区別はありませんが、変数名の前の接頭辞には、次のように大/小文字区別があります。
$Oracle.Package.SCOTT.MY_PACKAGE.g_var
「監視式」ウィンドウにパッケージ変数を追加する最も簡単な方法は、「データ」ウィンドウから変数をドラッグ・アンド・ドロップするか、「クラス」ウィンドウからパッケージをドラッグ・アンド・ドロップすることです。
データベース接続を介してPL/SQLをデバッグする場合など、データベース・デバッガの実行中は、ランダムに割り当てられたポートが使用されます。このため、ファイアウォールに問題が発生することがあります。この問題を回避するために、特定のポートが確実に使用されるようにide.propertiesファイルを編集できます。
ポートを指定するには、次のようにします。
必要な場合はJDeveloperを閉じます。
テキスト・エディタで、jdev_install/jdeveloper/jdev/system/oracle.jdeveloper.release_number/ide.properties
を開きます。
次のように入力します。
DatabaseDebuggerPortOverride=port_number
port_number
は、デバッグで使用するポート番号です。
ide.properties
を保存します。JDeveloperを再起動すると、指定したポートが使用されます。
JDeveloperでPL/SQLとJavaストアド・プロシージャをデバッグできます。
詳細は、次の該当する項を参照してください。
PL/SQLのデバッグを実行する前に、次の前提条件が満たされていることを確認してください。
データベース・ユーザー・アカウントに次の権限が付与されていること。
DEBUG ANY PROCEDURE
DEBUG CONNECT SESSION
PL/SQLコードはINTERPRETED
モードでコンパイルする必要があります。NATIVE
モードでコンパイルされたPL/SQLコードはデバッグできません。このモードは、データベースのinit.ora
ファイル内で設定します。このファイルの詳細は、Oracle Databaseのマニュアルを参照してください。
アクティブなアプリケーションおよびプロジェクトがない場合、デバッガでは、「アプリケーション」メニューからアクセスできる「デフォルト・プロジェクト・プロパティ」ダイアログで定義されているプロパティが使用されます。ただし、PL/SQLのデバッグ時に使用するアプリケーションおよびプロジェクトを作成することをお薦めします。「実行構成の編集」ダイアログの「起動設定」ページ(「アプリケーション」メニューからアクセスできる「プロジェクト・プロパティ」ダイアログの「実行/デバッグ/プロファイル」ページの「編集」ボタン)で、「デフォルトの前にアクティブなファイルを実行する」チェック・ボックスが選択されている(デフォルト設定)ことを確認する必要があります。これにより、デバッガに対して、デバッグの開始時にアクティブなファイルを実行するように(「アプリケーション」ウィンドウで選択したPL/SQLプロシージャを実行したり、エディタでアクティブなファイルを開くなど)指示します。
PL/SQLオブジェクトは、DEBUG
オプションを有効化した状態でコンパイルする必要があります。次の方法から1つ選択して、このタスクを実行します。
「プリファレンス」ダイアログ(「ツール」メニューからアクセス可能)の「データベース接続」ページで、「PL/SQLのデバッグ情報を生成」が選択されていることを確認し、デバッグ対象のオブジェクトを作成または再コンパイルします。
SQL*Plusで、ALTER SESSION SET PLSQL_DEBUG = true
を実行し、デバッグ対象のオブジェクトを作成または再コンパイルします。
SQL*Plusで、ALTER <procedure, function, package> <name> COMPILE DEBUG;
を実行します。
Javaストアド・プロシージャのデバッグを実行する前に、次の前提条件が満たされていることを確認してください。
Javaコードをデータベースにデプロイし、デバッグ情報を使用してコンパイルする必要があります。JDeveloperから、「プロジェクト・プロパティ」ダイアログ(「アプリケーション」メニューからアクセス可能)の「コンパイラ」ページで、「デバッグ情報を含める」チェック・ボックスが選択されていることを確認し、Javaストアド・プロシージャをデプロイします。
Javaストアド・プロシージャをステップ実行するには、JavaソースがJDeveloperプロジェクト内で使用可能であることと、データベースへのデプロイ内容と一貫していることが必要です。
PL/SQLプログラムをローカルでデバッグする場合は、デバッグを開始するためのコールをJDeveloperから直接行います。JDeveloperでは、デバッグ対象のプログラム(デバッグ・プロセス)が自動的に起動され、そのプログラムにデバッガがアタッチされます。
前述の前提条件が完了していることを確認してください。
JDeveloperでPL/SQLプログラムをローカルでデバッグするには、次のようにします。
「ウィンドウ」→「データベース」→「データベース」ウィンドウを選択します。
「IDE接続」またはアプリケーションを展開し、データベース接続を選択します。
スキーマを開き、デバッグ対象に応じて、該当するノード(「プロシージャ」、「ファンクション」または「パッケージ本体」)を開きます。
デバッグ対象のプロシージャ、ファンクションまたはパッケージを選択し、ダブルクリックしてエディタで開きます。
マージンをクリックしてPL/SQLコード内にブレークポイントを設定します。
注意: ブレークポイントは、実行可能なコード行に設定する必要があります。デバッガが停止しない場合は、ブレークポイントが実行可能なコード行に設定されていない可能性があります(ブレークポイントが検証済であることを確認してください)。また、デバッグ中のPL/SQLの前提条件が満たされていることを確認してください。特に、PL/SQLプログラムがINTERPRETEDモードでコンパイル済であることを確認します。 |
デバッグ対象のPL/SQLプログラム・ユニットが「アプリケーション」ウィンドウで選択されていることを確認します。
「デバッグ」ツールバー・ボタンをクリックします。
JDeveloperは最初のブレークポイントで実行を停止し(「プロジェクト・プロパティ」ダイアログの「デバッグの開始オプション」で設定している場合)、デバッガ・ウィンドウに状態を表示します。
JDeveloperのデバッガ・ウィンドウに表示されるデバッグ情報を確認します。詳細は、第14.7項 「Javaプログラムのデバッグ」を参照してください。
PL/SQLプログラムのデバッグを再開し、問題がなくなるまで実行します。
PL/SQLプログラムのリモート・デバッグとローカル・デバッグの主な違いは、デバッグ・セッションの開始方法です。リモート・デバッグの場合は、SQL*PlusなどのOracleクライアント、OCIプログラムであるDbms_Jobまたはトリガー起動を使用して、デバッグ対象のプログラムを手動で起動する必要があります。その後、デバッグ対象のデータベース・プログラムからJDeveloperデバッガへの接続を確立します。デバッグ対象プロセスが開始し、JDeveloperのデバッガがプロセスにアタッチされた後は、リモート・デバッグとローカル・デバッグの動作はよく似ています。
リモート・デバッガは、Oracle DatabaseでPL/SQLプログラムおよびJavaストアド・プロシージャとともに使用できます。
第29.3.3項「PL/SQLおよびJavaストアド・プロシージャのデバッグの前提条件」にリストされている前提条件が完了していることを確認してください。
JDeveloperを使用してPL/SQLプログラムをリモートでデバッグするには、次のようにします。
データベース接続を作成していない場合は、データベース接続を作成します。
プロジェクトが作成されていない場合は、プロジェクトを作成します。
「アプリケーション」ウィンドウで、プロジェクトを右クリックして「プロジェクト・プロパティ」を選択します。
「実行/デバッグ/プロファイル」を選択します。
既存の実行構成を選択するか、新規の構成を作成して、「編集」をクリックします。
「実行構成の編集」ダイアログで、PL/SQLを選択し、データベース接続を選択します。
「ツール設定」 - 「デバッガ」 - 「リモート」を選択し、リモート・デバッグ設定を設定します。
「データベース」ウィンドウで、接続を右クリックして「リモート・デバッグ」を選択します。
「データベース」ウィンドウで、「データベース」ノードを展開し、デバッグ対象のプロシージャ、ファンクションまたはパッケージに移動し、ダブルクリックしてソース・エディタで開きます。
ソース・エディタで、マージンをクリックしてPL/SQLコード内にブレークポイントを設定します。
「アプリケーション」ウィンドウで、プロジェクトを右クリックして「デバッグ」を選択します。
表示されるダイアログで、適切なリスニング・ポート番号を入力して「OK」をクリックします。他のプロセスで使用されていない有効なポート番号であれば、どの番号でも選択できます。たとえば、使用ポート番号は4000です。
注意: 次回にこのポートでデバッグする際に、このダイアログをバイパスする場合は、このダイアログの「パラメータを保存」チェック・ボックスを選択します。 「プロセス」ウィンドウに、デバッガがデバッグ接続をリスニングしていることを示すアイコンが表示されます。 |
SQL*PlusなどのOracleクライアントを使用して、デバッガ接続コマンドを発行します。使用するクライアントの種類にかかわらず、デバッガ接続コマンドを発行するセッションは、ブレーク・ポイントが含まれるPL/SQLプログラムを実行するセッションと同じにします。
たとえば、SQL*Plusを使用している場合は、次のコマンドを発行して、JDWPセッション用に指定したマシンおよびポートへのTCP/IP接続をオープンします。
EXEC DBMS_DEBUG_JDWP.CONNECT_TCP( '123.456.789.012', '4000' )
123.456.789.012
はJDeveloperを実行中のIPアドレスまたはホスト名で、4000
はデバッガがリスニング中のポート番号です。
これ以降は、ブレークポイントを含むPL/SQLコードをコールすると、JDeveloperデバッガがアクティブ化されます。
デバッガがデバッグ接続を受け入れると、「プロセス」ウィンドウ内の「プロセス」フォルダに新規のデバッグ・プロセスが反映されます。また、「ログ」ウィンドウに次のようなメッセージが表示されます。
Debugger accepted connection from remote process on port 4000.
さらに、JDeveloperのレイアウトが「設計」レイアウトから「デバッグ」レイアウト(ウィンドウの右下)に切り替わったことがわかります。「スタック」、「データ」および「監視式」などのデバッグ・ウィンドウも表示可能になっています。
「プロセス」ウィンドウでは、ポートがリスニングを継続中で、複数のデバッグ接続を受入れ可能であることがアイコンによって示されます。
Oracleクライアントに戻り、ブレークポイントを含むPL/SQLプログラム・ユニットを起動するコマンドを発行します。たとえば、SQL*Plusでは次のようなコマンドを発行します。
EXEC FOO;
FOO
はPL/SQLプロシージャ名です。
JDeveloperは最初のブレークポイントで実行を停止し(「アプリケーション」メニューからアクセス可能な「プロジェクト・プロパティ」ダイアログの「デバッグの開始オプション」で設定している場合)、デバッガ・ウィンドウに状態を表示します。詳細は、第14.7.7項「デバッガ開始オプションの設定方法」を参照してください。
問題がなくなるまでPL/SQLプロシージャをステップ実行してデバッグを再開します。詳細は、第14.7項 「Javaプログラムのデバッグ」を参照してください。
デバッグの終了後に、切断コマンドを使用してデバッグ・プロセスを切断します。たとえば、SQL*Plusから次のように入力します。
EXEC DBMS_DEBUG_JDWP.DISCONNECT;
次のメッセージが表示されます。
Debugger disconnected from remote process.
リスニング・ポートを終了するには、「プロセス」ウィンドウの「実行」アイコンを右クリックして「リスニングの停止」を選択します。
PL/SQLのデバッグ時に、「監視式」ウィンドウ、「インスペクタ」ウィンドウ、ブレークポイント条件およびブレークポイント・ログ式にPL/SQL式を使用できます。
デバッガでは、次の表のような受入可能で有効なPL/SQL式を使用できます。
表29-1 デバッガで使用可能なPL/SQL式
PL/SQL式 | 例 |
---|---|
単純変数名 |
|
フィールド・アクセス |
|
表要素 |
|
比較演算 |
|
算術演算 |
|
論理演算 |
|
パッケージ変数名 |
|
完全修飾パッケージ名 |
|
パッケージ本体変数名 |
|
完全修飾パッケージ本体名 |
|