TOP書籍連動> ストアドプロシージャの移行
まるごと PostgreSQL!
PostgreSQLとOracleによるデータベース相互移行マニュアル

第9回:ストアドプロシージャの移行(1)
著者:奥畑 裕樹(OKUHATA, Hiroki)   2005/12/2
前のページ  1  2
ストアドプロシージャの移行

   Oracle、PostgreSQLともに複数の言語でストアドプロシージャを作成することができます。OracleではPL/SQLまたはJava、PostgreSQLではPL/pgSQL、Perl、Tcl、Python、さらに最近ではJavaでもストアドプロシージャを作成することができます。

   ここではOracleのPL/SQLと、PostgreSQLのPL/pgSQLを使った移行方法を説明します。一見すると、PL/SQLとPL/pgSQLはよく似ています。しかし、細かいところで重要な違いがいくつかありますので注意が必要です。


ファンクションとプロシージャ

   OracleのPL/SQLでは、簡単に言うと返す値の数によって、ストアドファンクションとストアドプロシージャが区別されます。ストアドファンクションは1つの値を返しますが、ストアドプロシージャはOUT系パラメータ【注4】を使用して複数の値を返すことができます。

※注4: OUT系パラメータについては後述します。

   一方PostgreSQLでは、ストアドファンクションとストアドプロシージャの区別はありません。PostgreSQLのストアドプロシージャは常に1つの値しか返せないので、Oracleの用語で厳密に言えばストアドファンクションになります。

   ただし、PostgreSQLのストアドプロシージャは、複合型を戻り値とすることで擬似的に複数の値を返すことが可能です。この方法についても後述します。


宣言方法の違い

   まず、PL/SQL(リスト11リスト12)とPL/pgSQL(リスト13)における宣言方法の違いを見てみましょう。パッと見てわかるとおりとてもよく似ています。

CREATE FUNCTION ファンクション名( 引数)
  RETURN 返り値IS
DECLARE
    -- 変数の宣言
BEGIN
    -- 本文
END;

リスト11:Oracleのストアドファンクションの例

CREATE PROCEDURE プロシージャ名( 引数) IS
DECLARE
    -- 変数の宣言
BEGIN
    -- 本文
END;

リスト12:Oracleのストアドプロシージャの例

CREATE FUNCTION ファンクション名( 引数)
  RETURNS 返り値AS '
DECLARE
    -- 変数の宣言
BEGIN
    -- 本文
END
' LANGUAGE 'plpgsql';

リスト13:PostgreSQLのストアドプロシージャの例

   PL/SQLのストアドファンクションにおけるRETURN句は、PostgreSQLではRETURNS句になることに注意してください。また、PostgreSQLではストアドプロシージャの本体部分が1つの文字列として扱われていることにも注意してください。LANGUAGE句には、ストアドプロシージャの記述言語を指定します。plperlと指定すれば、Perl言語でストアドプロシージャを書くことも可能です。


無名ブロック

   Oracleには、下の例のように宣言を省略して直接実行できる「無名ブロック」の機能がありますが、PostgreSQLにはありません。

BEGIN
  DBMS_OUTPUT.PUT_LINE( 'Hello, World!' );
END;
   このためPostgreSQLでは、どんな小さなものでも必ず宣言してから呼び出す、という手順を踏む必要があります。

前のページ  1  2


奥畑 裕樹(OKUHATA, Hiroki)
著者プロフィール
奥畑 裕樹(OKUHATA, Hiroki)
Javaとオープンソース技術を得意とする技術コンサルタント。最近のテーマは、ソフトウェア開発の全体最適をはかること。気が付けば、10才のときにプログラミングを始めて以来、常に何かを作っている…。


INDEX
第9回:ストアドプロシージャの移行(1)
  GREATESTとLEAST関数
ストアドプロシージャの移行