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; 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'; 次に、呼び出し側では複合型から各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'; 実行した結果は次のようになります。
% 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 |
![]()