Mark A. Williams著 Oracle Developer Toolsを使用したMicrosoft Visual StudioでのPL/SQLのデバッグ Oracle Developer Tools for Visual Studio(ODT)のPL/SQLデバッガを使用すると、ネイティブ.NETコードのデバッグと同様にMicrosoft Visual StudioでPL/SQLコードを簡単にデバッグできます。 このコラムでは、ODTでPL/SQLのデバッグを設定する方法と、.NETソリューション内部からPL/SQLコードを作成してステップ・スルーする方法について説明します。 ODTでPL/SQLデバッガを使用するには、以下の前提条件を満たす必要があります。
このコラムに添付したPL/SQLコードをステップ・スルーするには、Oracle Databaseに含まれるHRサンプル・スキーマにアクセスできる必要があります。 統合されたPL/SQLデバッガ 新たに統合されたODT 10.2.0.2のPL/SQLデバッガを使用すると、Visual Studioを終了せずに、.NETおよびOracleソリューションのエンドツーエンド・デバッグをおこなうことができます。 プロシージャとファンクション(スタンドアロンおよびパッケージ化されたものの両方)、オブジェクト・メソッド、トリガーなどのPL/SQLコードを、C#またはVBコードをデバッグするのと同じ方法でVisual Studio環境内からデバッグできます。 ODTに統合されたPL/SQLデバッガでは、ブレーク・ポイントの設定、変数値の表示と変更、コール・スタックの検証といった従来のデバッグ作業を実行できます。 PL/SQLデバッガは、次の3つのモードのいずれかで使用します。 ダイレクト・データベース・デバッグ: ダイレクト・データベース・デバッグモードでは、Visual Studio環境から直接PL/SQLコードをデバッグできます。 ダイレクト・データベース・デバッグモードを使用する場合、Visual Studioソリューションや.NETコードは必要ありません。データベース内のPL/SQLコードを直接操作できます。 外部アプリケーション・デバッグ: コンパイル済みのバイナリやWindows以外のプラットフォームで実行されているアプリケーションからコールされるPL/SQLコードをデバッグする場合、外部アプリケーション・デバッグモードを使用します。 このモードでは、任意のプラットフォーム上の(Oracle Databaseクライアント・ライブラリ9.2以降で構築された)任意のアプリケーションからコールされるPL/SQLプログラムを、アプリケーションを変更することなくデバッグできます。 多層アプリケーション・デバッグ: .NETアプリケーション開発でもっとも効果を発揮するオプションは、多層アプリケーション・デバッグモードです。このモードを使用すると、Visual Studioソリューションからシームレスに.NETとPL/SQLの両方のコードをデバッグできます。 .NETコードから直接PL/SQLコードに移動して、再びもとに戻ることができます。 このコラムでは、多層アプリケーション・デバッグモードの使用方法について説明します。 デバッグ・セッション内で.NETコードとPL/SQLコードを同時に操作できるため、このモードは3つのモードの中でもっとも広く使用されると考えられます。 新規接続の作成 ODTを使用してPL/SQLをデバッグするための最初のステップは、Visual StudioのOracleエクスプローラで新規接続を作成することです。 Oracleエクスプローラが表示されていない場合は、メイン・メニューから「 表示 」→「 Oracleエクスプローラ 」を選択してください。 Oracleエクスプローラの最上位レベルにあるノードは、 データ接続 です。 データ接続 ノードに新規接続を作成するには、「 データ接続 」を右クリックしてから「 接続を追加... 」を選択します。 次に、 データソース名 に、使用するデータソース名を選択または入力します。 データソースは、一般にはTNS別名またはtnsnamesファイル・エントリとして知られています。 「 固有のユーザー名とパスワードを使用 」をクリックします。 ユーザー名 フィールドにHRと入力します。 パスワード フィールドに、使用しているデータベースでのHRユーザーのパスワードを入力します。 ロール リストに Default の値が含まれることを確認します。 提示された 接続名 を HR.ORAMAG に変更します。 「 テスト接続 」をクリックして、接続詳細情報がすべて正しく指定されていることを確認します。 「 OK 」をクリックして、接続設定を終了します。 権限がある場合は、上のステップを繰り返して、DBAロールを持ったSYSTEMユーザーに対して別の接続を作成します。 この接続には、SYSTEM.ORAMAGという名前を付けます。HRに適切なデバッグ権限を許可するには、SYSTEM接続が必要になります。 必要な権限の付与 Oracle Database 10g(10.1またはそれ以降)を使用している場合、HRユーザーに対して、DEBUG CONNECT SESSIONとDEBUG ANY PROCEDUREの2つの権限を付与する必要があります。 Oracle9i Database(9.2)を使用している場合は、DEBUG ANY PROCEDURE権限のみが必要になります(DEBUG ANY PROCEDURE権限の代わりに、デバッグ対象となる特定のPL/SQLプログラムに対してDEBUGおよびEXECUTE権限を付与することもできます)。 これらの権限が付与されてはじめて、HRユーザーはVisual Studio環境からPL/SQLコードをデバッグできます。 これらの権限を付与するには、DBA接続とODTの問合せウィンドウを使用します。 問合せウィンドウを開くには、Oracleエクスプローラで データ接続 の下にある「 SYSTEM.ORAMAG 」ノードを右クリックし、「 問合せウィンドウ 」を選択します。 最初の権限を付与するため、問合せエディタに GRANT DEBUG CONNECT SESSION TO HR と入力し、「 実行 」をクリックします。 2番目の権限を付与するため、問合せエディタの既存テキストを削除してから GRANT DEBUG ANY PROCEDURE TO HR と入力し、「 実行 」をクリックします。 PL/SQLパッケージとパッケージ本体の作成 ここまででデータベース接続を作成し、必要な権限を付与したため、次にPL/SQLデバッガの機能を確認するために使用するPL/SQLのサンプル・コードを作成します。 作成するのは、PL/SQLパッケージとPL/SQLパッケージ本体です。 PL/SQLパッケージは、パッケージ本体に含まれる機能について記述し、これを公開するものです。パッケージ本体にはパッケージで記述された機能が実装されています。 リスト1および2に示すPL/SQLのコード例は、PL/SQL配列内の各数値が素数であるかどうかを判定し、PL/SQLレコードを使用してJOBS表に新しい行を作成するものです。 PL/SQLコードを作成するには、ODTの問合せウィンドウを使用します。 問合せウィンドウを開くには、Oracleエクスプローラで「 HR.ORAMAG 」ノードを右クリックし、コンテキスト・メニューから「 問合せウィンドウ 」を選択します。 問い合わせエディタ フィールドにリスト1のテキストを入力してから、「 実行」をクリックしてパッケージを作成します。 次に、問合せエディタのフィールド内のテキストを リスト2 のテキストで置き換えてから、「 実行 」をクリックしてパッケージ本体を作成します。 リスト1および リスト2 のコードは、このコラムの ダウンロード・コード に含まれるDatabase.sqlスクリプトにも記述されています。 コード・リスト1: HR.ORAMAGのPL/SQLパッケージ・コード
CREATE OR REPLACE PACKAGE "HR"."ORAMAG" IS -- types for associative arrays that client will pass as arguments TYPE "T_IN_VALUES" IS TABLE OF NUMBER INDEX BY BINARY_INTEGER; TYPE "T_OUT_VALUES" IS TABLE OF NUMBER INDEX BY BINARY_INTEGER; -- procedure that accepts two associative arrays -- determines if an element is likely prime and -- sets value in output array PROCEDURE "DETERMINE_PRIMES" ("P_IN_VALUES" IN T_IN_VALUES, "P_OUT_VALUES" OUT T_OUT_VALUES); -- function that determines if a number is likely prime FUNCTION "IS_PRIME" ("P_NUMBER" IN NUMBER) RETURN NUMBER; -- constants used to return values from function IS_NOT_A_PRIME CONSTANT NUMBER DEFAULT 0; IS_A_PRIME CONSTANT NUMBER DEFAULT 1; -- pl/sql record type for the jobs table "JOBS_REC" jobs%rowtype; -- pl/sql procedure to add new job to jobs table PROCEDURE "ADD_NEW_JOB" ("P_JOB_ID" IN JOBS.JOB_ID%TYPE, "P_JOB_TITLE" IN JOBS.JOB_TITLE%TYPE, "P_MIN_SALARY" IN JOBS.MIN_SALARY%TYPE, "P_MAX_SALARY" IN JOBS.MAX_SALARY%TYPE); END "ORAMAG"; デバッグを有効にするには、デバッグ情報を含めてPL/SQLコードをデバッグする必要があります。 実行するには、Oracleエクスプローラへ移動して パッケージ ノードを開きます。 「 ORAMAG 」パッケージを探して右クリックし、メニューから「 デバッグのコンパイル 」を選択します。 ORAMAG パッケージとその下にある個々のプロシージャおよびファンクションの隣にあるアイコンが変わり、デバッグ情報を含んでコンパイルされたことが示されます。 .NETプロジェクトの作成 新規の.NETプロジェクトを作成し、PL/SQLコードのテストとデバッグをおこなうには、Visual Studioのメイン・メニューから「 ファイル 」→「 新規作成 」→「 プロジェクト 」を選択します。 プロジェクトの種類 リストから「 Visual C# 」を選択します。 テンプレート リストから「 コンソール アプリケーション 」を選択し、 プロジェクト名 フィールドに新規プロジェクト名(例:SepOct2006)を入力します。 PL/SQLコードにアクセスするには、プロジェクトにODP.NETアセンブリへの参照を追加する必要があります。 参照を追加するには、Visual Studioのメイン・メニューから「 プロジェクト 」→「 参照の追加 」を選択します。 コンポーネント名 リストから「 Oracle.DataAccess.dll 」を選択します。 ここまででODP.NETアセンブリへの参照が追加されたので、次にVisual Studioによって生成されたテンプレートのC#コードを リスト3 のコードで置換します。 新規プロジェクトを作成すると、デフォルトで Visual Studio ホスティング プロセスを有効にする デバッグ・オプションが有効化されます。 オラクルでは、このオプションを無効化することを推奨しています。無効化するには、Visual Studioメイン・メニューから「 プロジェクト 」→「 プロパティ... 」を選択して、「 デバッグ 」タブをクリックしてから、 デバッガを有効にするDebuggers リストで「 Visual Studio ホスティング プロセスを有効にする 」のチェックをはずします。 または、デバッガを開始していったん終了させたあとであれば、PL/SQLデバッガは正しく動作します。 デバッガ・オプションの設定 Visual Studio環境からシームレスにPL/SQLコードをデバッグするには、デバッグするPL/SQLコードをODTが探せるように設定する必要があります。 Visual Studioメイン・メニューから「 ツール 」→「 Options 」を選択し、 オプション リストから「 Oracle Developer Tools 」を選択します。次に、 使用可能なデータベース接続 リストの HR.ORAMAG の隣にあるチェック・ボックスをクリックします。 PL/SQLデバッガは、デバッグするコードを特定するためにここでチェックされた接続を参照します。したがって、別の接続を定義している場合、その接続がチェックされていることを確認してください。 同じ場所に、TCP/IPのポート範囲が表示されています。 PL/SQLのデバッグ中、Oracle Databaseはこの範囲にあるポートをランダムに使用してTCP/IP経由でVisual Studioに接続します。 使用しているマシンでこの範囲のポートが開いていること、およびファイアウォールでブロックされていないことを確認してください。 .NETと並行してPL/SQLをデバッグするためのODT設定の最後のステップは、アプリケーションのデバッグを有効化することです。 実行するには、Visual Studioメイン・メニューから「 ツール 」→「 Oracleアプリケーションのデバッグ 」を選択し、メニューで Oracleアプリケーションのデバッグ の隣に、この機能の有効化を示すチェック・マークがあることを確認します。 PL/SQLコードのデバッグ ここまででPL/SQLコードを作成し、HRユーザーに適切な権限を付与し、C#プロジェクトを作成したので、次はVisual Studio環境内でコードのデバッグをおこないます。 ブレーク・ポイントの設定: 実行中にデバッガを停止するには、C#コードとPL/SQLコードの両方にブレーク・ポイントを設定する必要があります。 C#コードでは、ExecuteNonQueryコールのあとにブレーク・ポイントを設定します。このコールは、PL/SQLのDETERMINE_PRIMESプロシージャを実行します。 さらに、PL/SQLコードのDETERMINE_PRIMESプロシージャ内で、BEGINキーワードのあとにブレーク・ポイントを設定します。 PL/SQLコード内にブレーク・ポイントを設定していない場合、デバッガはPL/SQLコード本体の内部では停止しません。 PL/SQLコードから戻っても、C#コード内にブレーク・ポイントを設定していない場合、デバッガはC#コード内で停止しません。 デバッグ・モードでソリューションをコンパイルし、実行するには、Visual Studioメニューから「 デバッグ 」→「 開始 」を選択します。 プログラムが実行を開始し、PL/SQLコード内のブレーク・ポイントでODTデバッガが実行を停止します(図1を参照)。 [F11]キーを押して、PL/SQLコード内を1行ずつステップ・スルーします。
変数値の表示と変更: この例をデバッグする間、C#アプリケーションがPL/SQLのDETERMINE_PRIMESプロシージャを設定してコールすることが確認できます。このプロシージャは、1番目のパラメータとして配列を受け取ります。 Visual StudioのPL/SQLデバッガを使用すると、デバッグ時に配列内の各要素を参照して、.NETアプリケーションからプロシージャに渡された最新データを確認できます。
デバッグ中は、配列などのタイプだけでなく、PL/SQLレコード・タイプ内の各要素やユーザー定義型などの複雑なタイプも確認できます。 プログラムの実行を続けるには、C#コード内に設定したブレーク・ポイントでVisual Studioデバッガが実行を停止するまで[F5]キーを押します。 PL/SQLのADD_NEW_JOBプロシージャ内にブレーク・ポイントを設定します。 再度[F5]キーを押して、ADD_NEW_JOBプロシージャ内のブレーク・ポイントに到達するまで実行を続けます。 このプロシージャ内を1行ずつステップ・スルーするには、[F11]キーを押します。 図2では、ADD_NEW_JOBストアド・プロシージャ内でPL/SQLレコード・タイプのJOBS_RECへドリルダウンする様子が示されています。 JOBS_RECを含むPL/SQLパッケージのグローバル変数を表示またはドリルダウンするには、 ウォッチ ウィンドウを使用します。このウィンドウはVisual Studioに組み込まれており、特定のプログラム変数を確認するために使用できます。 JOBS_RECを ウォッチ ウィンドウに追加するには、コード内でJOBS_RECを右クリックし、コンテキスト・メニューから「 ウォッチ式の追加 」を選択します。
PL/SQLコール・スタックの表示:もう1つの重要なPL/SQLデバッグ機能は、PL/SQLコール・スタックの表示機能です。 コール・スタックを調べることで、プログラムの現在の実行ポイントまでのコード・パスを特定できます。 コール・スタックを表示するには、Visual Studioの「 呼び出し履歴 」タブをクリックします。デバッグ・モードの場合、このタブはデフォルトで表示されています。 図3では、パッケージ本体に含まれるPL/SQLファンクションIS_PRIME内部のコール・スタックが示されています。
任意のレベルのスタックをダブルクリックすることで、対応するコード行へ移動できます。 まとめ このコラムで提供したサンプル・コードを使用すると、独自にPL/SQLデバッガの使用を体験できます。 PL/SQLデバッガは、C#やVBコードのデバッグ経験から使い慣れたデバッグ機能と同じ機能を提供します。共通の環境から.NETコードとPL/SQLコードの両方をシームレスにデバッグできる機能がツールに追加されたことは、.NETおよびOracleプログラマーにとって喜ばしいことです。
Mark A. Williams ( mawilliams@cheshamdbs.com )はOracle ACEおよびOracle Certified Professional DBAであり、 Pro .NET Oracle Programming (Apress、2004年)の著者でもあります。 |