プロが教えるわが家の防犯対策術!

以下のSQL文で、
あるストアドプロシージャを作成し、その引数の値を
WHERE句の検索条件に取ってカーソルを宣言したいので
すが、どうやってもエラーが出ます。結果として
カーソルで格納したデータを呼び出し元に返したいの
ですが…。下記の文は間違ってますか?
CREATE OR REPLACE PROCEDURE ss(
quote IN NUMBER
result OUT CHAR
)
IS
CURSOR cur IS SELECT empname FROM emp
WHERE empno = quote;
result cur%rowtype;
BEGIN
OPEN cur;
LOOP
FETCH cur INTO result;


END;

どうかよろしくお願いします。

A 回答 (3件)

>最終的にemp表から取得したenameの最後の値をもどしたいので、LOOPの外で


>result := cur_result.empname;で問題ないでしょうか?

ename? empnameのタイプミスですかね。
ちょっと私のコードにもミスがあったので、修正がてらに言うと、

OPEN cur;
FETCH cur INTO cur_result;
WHILE cur%FOUND LOOP
 result := cur_result.empname;
 FETCH cur INTO cur_result;
END LOOP;
CLOSE cur;

でいいと思いますよ。
結果が見つかる間だけループしているので、ループを抜ける際には、一番最後の値が入っています。

※先のコードでは、LOOP内でFETCHが抜けてて、そのあとにカーソルもCLOSEしてなかった。(^^;

ただ、「一番最後の値」ってところがちょっと気になるところで、複数件引っかからなければ良いのですが、引っかかってしまうと、どれが最終的に返値となるのかわかりませんね。
empnoで一意に特定できるなら良いですが、そうでないのなら、もしものために、ソート順を考えておいて、ORDER BY句くらいは付けておいた方が良いかもしれません。
    • good
    • 0
この回答へのお礼

遅れてすみません。
いただいたコードとは少し違いますけど、
OPEN cur;
LOOP
FETCH cur INTO cur_result;
EXIT WHEN cur_result%notfound;
result := cur_result.empname;
END LOOP;
CLOSE cur;
でできました。
どうもありがとうございました。

お礼日時:2004/06/23 07:11

result OUT CHAR



↑引数と↓が同じ名前だからでは?

result cur%rowtype;

あ、あと、
quote IN NUMBER
の末尾に「,」が抜けてる。

直すとすれば、

CREATE OR REPLACE PROCEDURE ss(
quote IN NUMBER,
result OUT CHAR
)
IS
CURSOR cur IS SELECT empname FROM emp
WHERE empno = quote;
cur_result cur%rowtype;
BEGIN
OPEN cur;
FETCH cur INTO cur_result;
WHILE cur%FOUND LOOP
 result := 何かセット;
END LOOP;
END;

こんな感じか。
でも、必ずしも結果が取得できるとは限らないのでLOOP内、またはLOOPの外で判定はすべきでしょうが。
それをresultで返したいとか?

返す値が一つであれば、ストアドファンクションでも良いと思いますよ。

CREATE OR REPLACE FUNCTION ss(
quote IN NUMBER
) RETURN CHAR
IS
CURSOR cur IS SELECT empname FROM emp

result CHAR;
BEGIN

RETURN result;
END;

こんな感じでしょうか。
true,falseを返したいならBOOLEANですね。

動作確認できないので、あくまでも推測ですが。

この回答への補足

enameじゃなくempnameでした。
たびたび申し訳ありません。

補足日時:2004/06/19 02:42
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
おっしゃる通りですね。カーソルのターゲットを
引数と別の名前にしないといけなっかたのですね。
最終的にemp表から取得したenameの最後の値をもどしたいので、LOOPの外で
result := cur_result.empname;で問題ないでしょうか?
実行環境の前に戻ったら早速やってみます。
あと、quote IN NUMBERとresult OUT CHARの間に,が無いのは質問する際の脱字でした。すいません。
どうもありがとうございました。

お礼日時:2004/06/19 02:41

プロシージャの引数として受け取っている result と同じ名前で、プロシージャ本体の中でも宣言してるところがエラーなんじゃないでしょうか。


カーソル周りはこれでいいと思いますよ。

戻す結果がCHAR型1つだけなら、CHAR型を返すFUNCTIONでもいいと思いますけど。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
CURSORの検索条件にはもともと引数を渡せないのじゃ
ないかと不安でしたが、大筋は間違っていないようなので安心しました。

お礼日時:2004/06/19 02:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す