PL/SQLプロシージャの単体テストを行うために、テストドライバ用プログラムを作成する必要はありません。

PL/SQL Developer のTestウィンドウで、任意のPL/SQL無名ブロックを実行し、変数の値を設定・確認することが可能です。

データ検索とデータ補正をセットにしたその場限りの処理など、即興でPL/SQLを書いて実行する場合にも、役に立つでしょう。

Testウィンドウでは、以下の機能が実現されています。

  1. PL/SQLブロックを編集できる。(特に説明を要しませんが、もちろんコード補完、Drag&Dropも使えます。)
  2. 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文と一緒に変数定義セクションも保存されるため、同じ内容のテストを後日に繰り返し実行することが容易です。