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

   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

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

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30