• ベストアンサー

[Oracle9i]PL/SQLでFETCHしても、%FOUND=TRUEにならない

簡単なことだと思うのですが、はまってしまったので質問させてください。 以下のようなコードがあります。PL/SQLで書いてます。 SELECTした内容をFETCHして、IF文の%FOUNDで処理内容を変えているのですが、%FOUND=FALSEで必ず返ってきています。SELECT文自体でデータはひっぱって来ている(別で流しました)ようなので、理由が全然わからずまいってます。 -------------------------------------------------- FUNCTION get_siten_cd(siten_cd varchar2) RETURN varchar2 IS ret_siten_cd varchar(4); --4桁支店コード /*カーソル定義*/ CURSOR cs is SELECT SITEN_CD FROM MEI1.SITEN_MST WHERE SITEN_CD3 = siten_cd; /**カーソルに基づくレコードの定義**/ rs cs%ROWTYPE; BEGIN OPEN cs; FETCH cs INTO rs; IF cs%FOUND THEN --データが存在する場合 ret_siten_cd := rs.SITEN_CD; ELSE --データが存在しない場合 ret_siten_cd := NULL; END IF; CLOSE cs; RETURN ret_siten_cd; END; -------------------------------------------------- よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • jmh
  • ベストアンサー率23% (71/304)
回答No.3

列名(SITEN_CD)と引数(siten_cd)が同じ名前だからかも。

aw11
質問者

お礼

正解ですw。 ってか、ダメなんですねこれ。知りませんでした。 なんたか自分で解決しました。 皆さん回答ありがとうございましたっ!

すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.2

こんばんは。 Functionの引数の「siten_cd」には、ちゃんと値が入っていますか? SQLが行セットを返していないのが原因と思われますが・・・。 %ROWCOUNTは取れますか? 取れているならFETCHした時点で「rs」の中に入っているはずなので、dbms_output.put_lineで表示してみてください。 IF文の問題ではないと思いますよ。 (^^ゞ

aw11
質問者

お礼

回答ありがとうございます。 皆さんの言われたことほとんどやってました。 SQLも別で流してますし、dbms_output.put_lineも使って変数の中身やら表示してました。ちょっと説明が足りませんでした。すみません。 ただ、どうしてもSQLの結果が取れてなくて。 オラクルマスターのプラチナ持ってる人も知らなかったみたいですw。

すると、全ての回答が全文表示されます。
回答No.1

文法的に間違いはないと思います。そうなるとあとは、やはりSelectで1行も取得できていないという事になります。 実際に見えないところを疑うしかないのですが、siten_cdにはきちんと値が入っているのでしょうか。 あるいはrs.SITEN_CDには値は入っていないですか?(つまりFOUNDはFalseだけれど、実は成功しているパターン。あり得ないか・・・) あとはcs%NOTFOUNDを使ってIF文を書き直してみるか・・・ すみません、考え付く限り書いてしまいました。何かのヒントにでもなればと思います。

aw11
質問者

お礼

回答ありがとうございますっ! 上にも書いてありますが、なかなか意外?なミスでした。

すると、全ての回答が全文表示されます。

関連するQ&A