
以下の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;
どうかよろしくお願いします。
No.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句くらいは付けておいた方が良いかもしれません。
遅れてすみません。
いただいたコードとは少し違いますけど、
OPEN cur;
LOOP
FETCH cur INTO cur_result;
EXIT WHEN cur_result%notfound;
result := cur_result.empname;
END LOOP;
CLOSE cur;
でできました。
どうもありがとうございました。
No.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の間に,が無いのは質問する際の脱字でした。すいません。
どうもありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PL/SQLカーソルの2重FORループ...
-
PL/SQLでのSQL文法
-
カーソル定義での条件分岐
-
ORA-00904:無効な識別子の回避...
-
PL/SQLにてカーソル名を変数に
-
Statement ignored というエラー
-
Accessのマクロでモジュールを...
-
Access VBAで行ラベルが定義さ...
-
Accessで年月日のデータ...
-
sqlplusでヘッダーが付かない
-
SQL*Loaderでのsysdate使用
-
DATE型の省略値について
-
キャッシュを使わずにSELECTを...
-
日付型カラムへのデータINSERT
-
ACCESS、時間ごとの集計の仕方は?
-
ストアド実行時のエラー「参照...
-
callで順に実行されるプロシー...
-
sqlplusのspoolで空白行出現
-
OutlookVBAで作成したマクロに...
-
ROW_NUMBER()を使用したデータ取得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PL/SQLカーソルの2重FORループ...
-
PL/SQLでのSQL文法
-
カーソル定義での条件分岐
-
ORA-00904:無効な識別子の回避...
-
自動連番でカラムを更新したい
-
Texの枠囲み調節
-
カーソルフェッチにて、最終レ...
-
カーソルで集合関数を使った場...
-
PL/SQLのOPEN cursor_name FOR...
-
PL/SQLでの参照
-
【PL/SQL】LOOPした動的SQLにて...
-
T-SQLのカーソルで
-
PL/SQLにて、マスタから取得し...
-
PL/SQL カーソルのFROM句にカー...
-
カーソルループ内部でログを出力
-
【PL/SQL】CURSOR ・・・ IS SE...
-
PL/SQLのカーソルについて
-
T-SQLで
-
[Oracle9i]PL/SQLでFETCHしても...
-
PL/SQLにてカーソル名を変数に
おすすめ情報