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

OUTパラメーター   プロシージャー移行3回目の今回は、OUT/IN OUTパラメータについて紹介します。

奥畑 裕樹

2005年12月16日 20:00

OUTパラメーター

   プロシージャー移行3回目の今回は、OUT/IN OUTパラメータについて紹介します。

   PL/SQLにおけるOUTモードのパラメータには、値を書き込むことができ、ストアドプロシージャから呼び出し側に、その値を返すことができます(リスト18)。


CREATE PROCEDURE MUL_DIV( A IN NUMBER,
                          B IN NUMBER,
                          MUL OUT NUMBER,
                          DIV OUT NUMBER ) IS
BEGIN
  MUL := A * B;
  DIV := A / B;
END;

DECLARE
  M NUMBER;
  D NUMBER;
BEGIN
  MUL_DIV( 8, 2, M, D );
  DBMS_OUTPUT.PUT_LINE( '8 * 2 = ' || M );
  DBMS_OUTPUT.PUT_LINE( '8 / 2 = ' || D );
END;

リスト18:OracleのOUTモードパラメータへの書き込み


   PostgreSQLにはOUTパラメータがありませんが、複合型を返すことができるので、一度に複数の値を返すことは可能です。ただしその場合は、値の受け取り方がまったく違いますので、呼び出し側での変更も必要です。

   まず、複数の値を返すための複合型を定義します。ストアドプロシージャの内部では、複合型に各OUTパラメータの値を入れて返すようにします(リスト19)。
 

CREATE TYPE MUL_DIV_OUTS AS
  ( MUL INTEGER, DIV INTEGER );

CREATE OR REPLACE FUNCTION
  MUL_DIV( INTEGER, INTEGER )
RETURNS MUL_DIV_OUTS AS '
  DECLARE
    A ALIAS FOR $1;
    B ALIAS FOR $2;
    MUL INTEGER;
    DIV INTEGER;
    OUTS MUL_DIV_OUTS;
  BEGIN
    MUL := A * B;
    DIV := A / B;
    SELECT INTO OUTS MUL, DIV;
    RETURN OUTS;
  END;
' LANGUAGE 'plpgsql';

リスト19:PostgreSQLの複合型の定義


   次に、呼び出し側では複合型から各OUTパラメータを取り出し、該当する変数に代入するようにします(リスト20)。
 

CREATE OR REPLACE FUNCTION TEST_MUL_DIV()
  RETURNS VOID AS '
DECLARE
  M INTEGER;
  D INTEGER;
  OUTS MUL_DIV_OUTS%ROWTYPE;
BEGIN
  SELECT INTO OUTS * FROM MUL_DIV( 8, 2 );
  M := OUTS.MUL;
  D := OUTS.DIV;
  RAISE NOTICE ''8 * 2 = %'', M;
  RAISE NOTICE ''8 / 2 = %'', D;
  RETURN;
END;
' LANGUAGE 'plpgsql';

リスト20:呼び出し側でのパラメータの代入

   実行した結果は次のようになります。
 

% SELECT TEST_MUL_DIV();

 NOTICE: 8 * 2 = 16
 NOTICE: 8 / 2 = 4

PL/SQLのパラメータの3つのモード

   PL/SQLのパラメータには、IN、OUT、INOUTの3つのモードがあります。このうち、INモードはデフォルトのモードで省略することができます。リスト16は、次のように書いても同じです。
 
 CREATE FUNCTION
   SAY_A_IS_B( A IN VARCHAR2, B IN VARCHAR2 )
 RETURN VARCHAR2 IS
 BEGIN
   RETURN A || ' is ' || B;
 END;

人気記事トップ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