PostgreSQLとOracleによるデータベース相互移行マニュアル 9

ストアドプロシージャの移行

ストアドプロシージャの移行

   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では、どんな小さなものでも必ず宣言してから呼び出す、という手順を踏む必要があります。

 

この記事をシェアしてください

人気記事トップ10

人気記事ランキングをもっと見る