- ベストアンサー
PL/SQLでカーソルを指定する方法
以下の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; どうかよろしくお願いします。
- みんなの回答 (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句くらいは付けておいた方が良いかもしれません。
その他の回答 (2)
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ですね。 動作確認できないので、あくまでも推測ですが。
お礼
回答ありがとうございます。 おっしゃる通りですね。カーソルのターゲットを 引数と別の名前にしないといけなっかたのですね。 最終的にemp表から取得したenameの最後の値をもどしたいので、LOOPの外で result := cur_result.empname;で問題ないでしょうか? 実行環境の前に戻ったら早速やってみます。 あと、quote IN NUMBERとresult OUT CHARの間に,が無いのは質問する際の脱字でした。すいません。 どうもありがとうございました。
補足
enameじゃなくempnameでした。 たびたび申し訳ありません。
- tomoptomop
- ベストアンサー率7% (1/13)
プロシージャの引数として受け取っている result と同じ名前で、プロシージャ本体の中でも宣言してるところがエラーなんじゃないでしょうか。 カーソル周りはこれでいいと思いますよ。 戻す結果がCHAR型1つだけなら、CHAR型を返すFUNCTIONでもいいと思いますけど。
お礼
回答ありがとうございます。 CURSORの検索条件にはもともと引数を渡せないのじゃ ないかと不安でしたが、大筋は間違っていないようなので安心しました。
お礼
遅れてすみません。 いただいたコードとは少し違いますけど、 OPEN cur; LOOP FETCH cur INTO cur_result; EXIT WHEN cur_result%notfound; result := cur_result.empname; END LOOP; CLOSE cur; でできました。 どうもありがとうございました。