PL/SQLプロシージャの単体テストを行うために、テストドライバ用プログラムを作成する必要はありません。
PL/SQL Developer のTestウィンドウで、任意のPL/SQL無名ブロックを実行し、変数の値を設定・確認することが可能です。
データ検索とデータ補正をセットにしたその場限りの処理など、即興でPL/SQLを書いて実行する場合にも、役に立つでしょう。
Testウィンドウでは、以下の機能が実現されています。
- PL/SQLブロックを編集できる。(特に説明を要しませんが、もちろんコード補完、Drag&Dropも使えます。)
- PL/SQLブロックを実行/デバッグできる。ブレークポイントを設置しての実行、トレース実行、ステップ実行もできる。
変数の設定、値の確認ができ、DBMS_Outputの出力も確認できる。
PL/SQLブロックの実行・デバッグ
実際にPL/SQLブロックを実行してみましょう。メニューから”File/New/Test Window" を選ぶか、新規作成ボタンから"Test Window" を選ぶかすると、Testウィンドウが開きます。このウィンドウには最初からPL/SQL無名ブロックのテンプレートが作成されています。
Test Window では、PL/SQLブロックの編集、ファイルへの保存、ファイルからの読み出しができます。以下のように編集してみましょう。
declare begin for c in (select ename, empno from emp) loop if c.ename = 'ALLEN'then dbms_output.put_line(***
|| c.ename ||***
); else dbms_output.put_line('<<<|| c.ename ||
>>>'); end if; end loop; end;
上記のPL/SQLを実行してみましょう。「F8」を押すか、「Start Debugger」ボタンに続いて「Run」ボタンを押すと実行が行われます。「Start Debugger」ボタンのあとは、ステップ実行やトレース実行も可能です。DBMS_Outputの出力を以下のように画面上ですぐに確認することができます。
パラメータ(変数)を与えてPL/SQLを実行する
PL/SQLブロックを外部プログラム(VBやDelphiなど)から呼び出す際に、変数を受け渡すことが可能です。このような変数(バインド変数)はPL/SQLブロック中で「:」を名称の前につけて記述します。たとえば以下では「ename」「v_job」「C」の3つの変数を用いています。
このうち、enameは入力を渡すための変数で、v_jobとCは出力値を受け取るための変数です。
declare v_empno integer; begin select empno, job into v_empno, :v_job from emp where ename = :ename;dbms_output.put_line(v_empno);
open :C for select * from dept;
end;
上記の例のPL/SQL文をTestウィンドウに書き込んで、下図中赤丸で囲んだ「変数スキャン」ボタンを押すと、PL/SQL文中の変数(コロンで始まる変数)が発見され、変数一覧が自動作成されます。変数の型までは自動認識されないので、ここはユーザが変数の型を正しく設定する必要があります。(この例の場合、Cは Cursor型に直す必要があります)
実行に先立って、入力変数(ename)に値を設定します。たとえば”SMITH”など、EMPテーブル中に実在する値を設定します。
入力変数の設定が終わったら、「Start Debugger」を押してから「実行」「トレース実行」「ステップ実行」のいずれかの方法でPL/SQLブロックの実行が可能です。実行によって、出力変数 v_job に値が設定されると、即座にその結果が変数一覧に反映されます(下図のマル(1))。なお、カーソル変数の出力結果は、別ウィンドウにカーソルデータを取得することで確認が可能です(例の場合、下図マル(2)のボタンによって、Cursor result 画面が開いています)
一つの検索条件パラメータについて、複数のカーソルを返すようなストアドプロシージャの単体テストも、PL/SQL Developerを使えば簡単に実行できることがわかると思います。テストドライバとしてVBプログラムなどを作成する必要はありません。
また、Testウィンドウを「保存」すると、PL/SQL文と一緒に変数定義セクションも保存されるため、同じ内容のテストを後日に繰り返し実行することが容易です。