Oracleでは、PL/SQL言語を用いて、サーバ上にストアド・プロシージャを作成することができます。もちろん、DOAからストアドプロシージャを呼び出すことが可能です。ここでは、以下のようにPL/SQLストアドプロシージャの使い方を分類し、それぞれの方法を実例を用いて説明します。

なお、このページに示すTOracleQueryの利用法については基本的な仕組みとして一通り目を通した上で、カーソル変数を返すもの以外の場合には
TOraclePackage を使うことをおすすめします。

作成方法
機能
説明セクション
独立のプロシージャ データ更新のみ 更新ストアドプロシージャ(入力パラメータのみ)
  データ更新+
出力パラメータ

更新ストアドプロシージャ(出力パラメータあり)

  (データ更新+)
戻り値を返す
ストアドファンクション(入力パラメータ)=>戻り値
パッケージ・プロシージャ データ更新のみ パッケージ・プロシージャ

 

(データ更新+)
戻り値を返す
パッケージ・ファンクション
  データ検索 カーソル変数を返すパッケージ・プロシージャ
独立のプロシージャ データ検索 カーソル変数を返すプロシージャ


簡単なPL/SQLプロシージャ(更新系)の呼び出し

データを更新し、戻り値のないPL/SQLプロシージャの呼び出しは簡単です。例えば以下のようなプロシージャの場合は

  create or replace procedure TestProc1(N IN NUMBER) is
    i number;
  begin
    for i in 1 .. 10 loop
      insert into testtable values (i, 'test')
    end loop;
  end TestProc1;

TOracleQueryコンポーネントのSQLプロパティに、以下のようにプロシージャ呼び出しを行うPL/SQL無名ブロックを記述してExecuteメソッドを実行すればよいのです。簡単ですね。

  BEGIN
    TestProc1(10);
  END;

引数をアプリケーションから与えたい場合は、変数を使います。

  //OracleQuery1.SQL = 'BEGIN TestProc(:N); END;'
  // Integer型のInput Variableとして N を定義
  with OracleQuery1 do begin
    SetVariable('N', 10);
    Execute;
  end;


結果を返すPL/SQLファンクションの呼び出し

戻り値を返すPL/SQLファンクションを呼び出す場合は、戻り値を変数に代入する形式のPL/SQL無名ブロックをTOracleQueryのSQLに記述してExecuteメソッドを呼びます。例えば、以下のような関数を呼ぶには...

  create or replace function With_Tax(AValue in number) return number is
    Result number;
  begin
    Result := floor(AValue * 1.05);
    return(Result);
  end With_Tax;

このようにします。(
TOraclePackageを使うともっと簡単です)

  //OracleQuery1.SQL = 
  //  BEGIN
  //    :Result := With_Tax(:N);
  //  END;
  // 
  //  Integer型のInput Variableとして N を定義
  //  Integer型のOutput VariableとしてResultを定義

  with OracleQuery1 do begin
    SetVariable('N', 100);
    Execute;
    Showmessage('結果は' + IntToStr(GetVariable('Result')));
  end;


出力パラメータを返すプロシージャの呼び出し

入力パラメータと出力パラメータの両方を持つプロシージャの呼び出しは以下のように行います。(TOraclePackageを使った方が簡単です)

  create or replace procedure TestProc2(N IN NUMBER, R OUT NUMBER) is
  begin
    R := N * N;
  end TestProc2;

  は...以下のようなPL/SQLブロックで呼び出します

  BEGIN
    TestProc2(:N, :R);
  END;

  このとき
  N -- Integer型のInput変数
  R -- Integer型のOutput変数として宣言して

  with OracleQuery1 do begin
    SetVariable('N', 100);
    Execute;
    Showmessage('結果は' + IntToStr(GetVariable('R')));
  end;