- PR -

PL/SQLでのOUTパラメータ利用について

1
投稿者投稿内容
ある
常連さん
会議室デビュー日: 2006/01/21
投稿数: 23
投稿日時: 2007-10-30 20:38
○環境
サーバーOS:Windows2000server
DB:Oracle 8.1.7

この環境にて、下記のようなプロシージャを作成したところ
------------------------------------------------------
Create Procedure ProcA(
i_para1 IN CHAR,
i_para2 IN CHAR,
o_paraA OUT CHAR,
o_paraB OUT NUMBER
) IS
BEGIN
--パッケージを呼んで、o_paraAにデータを代入する
PACKA.ProcB(
i_para1,
i_para2,
o_paraA --5byteの文字が戻ってくる
);

INSERT INTO TESTDB
VALUES( 'A', --NOT NULL項目
'B', --NOT NULL項目
o_paraA --NOT NULL項目
);
o_paraB := 0;

EXCEPTION
WHEN OTHERS THEN
o_paraB := 9;
END;
------------------------------------------------------
INSERT時にNULLを代入してエラーになってしまいました。
 (Ora-01400 が発生)
しかし、唯一NULLの可能性があるo_paraAの中身を確認すると
データが代入されています。(このプロシージャを呼び出すVBや
ObjectBrowserでの単体実行で確認済み)
そもそも、PACKA.ProcBは必ず何か戻すのでNULLはありえません。

そこで、
------------------------------------------------------
Create Procedure ProcA(
i_para1 IN CHAR,
i_para2 IN CHAR,
o_paraA OUT CHAR,
o_paraB OUT NUMBER
) IS
w_paraA CHAR(5); --変数を作ってみる

BEGIN
--パッケージを呼んで、w_paraAにデータを代入する用に修正
PACKA.ProcB(
i_para1,
i_para2,
w_paraA --5byteの文字が戻ってくる
);

INSERT INTO TESTDB
VALUES( 'A', --NOT NULL項目
'B', --NOT NULL項目
w_paraA --NOT NULL項目
);
o_paraB := 0;
o_paraA := w_paraA;

EXCEPTION
WHEN OTHERS THEN
o_paraB := 9;
END;
------------------------------------------------------
と、変数に代入して、o_paraAは値を戻すだけにして実行すると
問題なく実行されます。

とりあえず、問題としては変数を利用することで解決するのですが、
OUTパラメータを戻り値以外で利用するといけない?という疑問が
残ります。
ご存知の方居ませんか?
上総
大ベテラン
会議室デビュー日: 2006/06/22
投稿数: 107
投稿日時: 2007-10-30 21:03
 ストアードプロシージャでは、INは入力専用・OUTは出力専用・IN OUTは
入力・出力で使用可能となります。

1.ProcA(i_para1,i_para2, o_para1,o_Para2)を実行
 引数の値がそれぞれ次のようになっているとして
 i_para1=1
 i_para2=2
 o_para1=NULL
 o_para2=NULL

2.エラー発生

3.o_para1にはProcBの実行結果が設定されている。

といった具合でしょうか?

だとしたら単純にプロシージャ内でo_paraA(o_para1)はOUT設定の為、
ProcBの戻り値は格納できますが以降のINSERT文では"OUTパラメータ"をNULLと
みなして処理を行い、エラーが発生しているだけです。
1

スキルアップ/キャリアアップ(JOB@IT)