こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

【PL/SQL】IF文( EXIT WHEN )でプロシージャの実行結果から判断させたい

Oracleで動くPL/SQLを作成してます。

プロシージャの実行結果をIF文に入れて、
実行結果からさらに処理を走らせたいのですが
エラーが出てしまいます。

例)
CREATE PROCEDURE TEST1(id NUMBER)
BEGIN
select NAME from TBLA where DID = id and ROWNUM <= 1;
END;

CREATE PROCEDURE TEST2(id NUMBER)
BEGIN
LOOP
EXIT WHEN ( TEST1(id) is not null );☆ここがうまくいかない。
id := id + 1;
END LOOP;
END;

TEST2のCreate時にTEST1は関数として存在しないというエラーメッセージが表示されます。
IF(EXIT WHEN)文中からはずして
TEST1(id)のみの実行では、エラーが起きず
IF文に入れるとエラーが起きるところまでは分かりました。

例はかなり簡略しているのですが、
どうしたらうまく動くのか分かる方がいれば
教えてもらいたいです。

投稿日時 - 2008-10-23 00:20:40

QNo.4422434

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

引数に"OUT"を付けることで対応可能
----
CREATE OR REPLACE PROCEDURE TEST1(
  id IN NUMBER,
  NAME1 OUT VARCHAR2,--型は適当、実装にあわせて変更して
  TYPE1 OUT VARCHAR2
)IS -- ↑これ
BEGIN
  SELECT NAME,TYPE INTO NAME1,TYPE1 FROM TBLA WHERE DID = id AND ROWNUM <= 1;
END;
/

で、TEST1をこう呼ぶ

CREATE OR REPLACE PROCEDURE TEST2(id IN NUMBER)
IS
  vNAME VARCHAR2(100);--これも適当なんで
  vTYPE VARCHAR2(100);
BEGIN
  LOOP
    TEST1(id,vNAME,vTYPE);--これ
    EXIT WHEN ( vTYPE is not null );
    id := id + 1;
  END LOOP;
END;
/

投稿日時 - 2008-10-23 21:48:07

ANo.1

そのエラーメッセージの通りです。
PROCEDUREは関数ではありません。関数はFUNCTIONで作ります。

投稿日時 - 2008-10-23 00:48:22

補足

反応ありがとうございます。

例が悪かったので補足します。
プロシージャTEST1では複数の項目の値を返します。
( select NAME,TYPE into NAME1, TYPE1 from TBLA where DID = id and ROWNUM <= 1;)
FUNTIONでは1個の値しか返さないという理解なので
PROCEDUREで作ろうとしています。

こういう場合の決まり文法などがあるようでしたら
ご教授いただけないでしょうか?

投稿日時 - 2008-10-23 11:48:39

あなたにオススメの質問