
以下の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で質問しましょう!
似たような質問が見つかりました
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- モニター・ディスプレイ 「.cur」のアイコン表示について 4 2023/03/04 10:21
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- MySQL SQL任意に並び替えをしたい 2 2023/08/28 10:47
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- オープンソース Python openpyxlを使用したセル番地の使用について 1 2023/08/03 22:05
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PL/SQLでカーソルを指定する方法
-
PL/SQL カーソルのFROM句にカー...
-
PL/SQLでのSQL文法
-
PL/SQLカーソルの2重FORループ...
-
Accessのマクロでモジュールを...
-
sqlplusでヘッダーが付かない
-
今日の日付が入った行のデータ...
-
Statement ignored というエラー
-
PL/SQL 実行中のSID
-
エクセルVBAでUserFormを起動し...
-
ODBCリンクの際にACCESSでは読...
-
或るプロシージャの呼び出し元判定
-
excel/vba/public変数
-
SQL Sever での日付の差の求め...
-
SQL文のエラー
-
別のスキーマのテーブルアップ...
-
14桁の日付(YYYYMMDDHHMMSS)を...
-
エクセル 日付による並べ替え...
-
SQLで部分的にGROUP BYしたいとき
-
SQLserver算術オーバーフロ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PL/SQLカーソルの2重FORループ...
-
PL/SQLでのSQL文法
-
Texの枠囲み調節
-
カーソル定義での条件分岐
-
カーソルで集合関数を使った場...
-
自動連番でカラムを更新したい
-
[Oracle9i]PL/SQLでFETCHしても...
-
ROW_NUMBER BY PL/SQL
-
動的なSQLからカーソルを返す。
-
カーソルフェッチにて、最終レ...
-
PL/SQLのOPEN cursor_name FOR...
-
ループカウンタの値
-
PL/SQL カーソルのFROM句にカー...
-
【PL/SQL】CURSOR ・・・ IS SE...
-
PL/SQLで
-
PL/SQLにて、マスタから取得し...
-
カーソルループ内部でログを出力
-
ACCESS VBAでループ中に制御を...
-
PL/SQL)Functionの引数(文字列...
-
指定した時間を除くためのテー...
おすすめ情報