ストアドプロシージャの移行
ストアドプロシージャの移行
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】を使用して複数 の値を返すことができます。
一方PostgreSQLでは、ストアドファンクションとストアドプロシージャの区別はありません。PostgreSQLのストアドプロシージャは常に1つの値しか返せないので、Oracleの用語で厳密に言えばストアドファンクションになります。
ただし、PostgreSQLのストアドプロシージャは、複合型を戻り値とすることで擬似的に複数の値を返すことが可能です。この方法についても後述します。
宣言方法の違い
まず、PL/SQL(リスト11リスト12)とPL/pgSQL(リスト13)における宣言方法の違いを見てみましょう。パッと見てわかるとおりとてもよく似ています。
CREATE FUNCTION ファンクション名( 引数)
RETURN 返り値IS
DECLARE
-- 変数の宣言
BEGIN
-- 本文
END; CREATE PROCEDURE プロシージャ名( 引数) IS
DECLARE
-- 変数の宣言
BEGIN
-- 本文
END; CREATE FUNCTION ファンクション名( 引数)
RETURNS 返り値AS '
DECLARE
-- 変数の宣言
BEGIN
-- 本文
END
' LANGUAGE 'plpgsql'; PL/SQLのストアドファンクションにおけるRETURN句は、PostgreSQLでは RETURNS句になることに注意してください。また、PostgreSQLではストアドプロシージャの本体部分が1つの文字列として扱われていることに も注意してください。LANGUAGE句には、ストアドプロシージャの記述言語を指定します。plperlと指定すれば、Perl言語でストアドプロシー ジャを書くことも可能です。
無名ブロック
Oracleには、下の例のように宣言を省略して直接実行できる「無名ブロック」の機能がありますが、PostgreSQLにはありません。
BEGIN
DBMS_OUTPUT.PUT_LINE( 'Hello, World!' );
END;
このためPostgreSQLでは、どんな小さなものでも必ず宣言してから呼び出す、という手順を踏む必要があります。