• ベストアンサー

PL/SQLに関して

PL/SQLに関しての質問です。 1、プロシージャの内部にファンクションをネストするなどということはできるのでしょうか? (内部ファンクションのような感じで) 2、プロシージャからファンクションを呼び出し、ファンクションの戻り値をレコード型変数にした場合、ファンクションでSELECTしたレコード件数が0件であった場合、例外ブロックのWHEN no_data・・・THEN で、RETURN NULLで戻すことはできるでしょうか? (呼び出し側で、レコード型変数にNULLを代入できますか?) 3、ObjectBrowserからストアドプロシージャを実行するとき、引数ありのストアドプロシージャを実行する方法を教えてください。(または参考WEBサイトを教えてください。) いずれも、試す環境が今ないため、ご回答のほどよろしくお願いします。

  • yumi_
  • お礼率73% (45/61)
  • Oracle
  • 回答数2
  • ありがとう数7

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

  • ベストアンサー
  • DK10410
  • ベストアンサー率50% (2/4)
回答No.2

1.できますよ。通常の内部PROCのように宣言とコーディングすれば使用できます。 2.ファンクション内でカーソルを使用してカーソルをOpenし、Fetchでデータ取得を実行したあとにカーソルをCloseする前に『IF Cursor名%NOTFOUND then』で対応もできますが、通常カーソルを使用してOpen・Fetchした場合、Notfoundの場合定数にはnullがセットされる(というか何も取得できないので初期処理でnullクリアしておけばnullのまま)のでnullがリターンされるはず。 レコード型で定義されている定数に対しnullを代入するとレコード全体の項目に対しnullがセットされます。 3.ObjectBrowserは実行時、引数を入力するための画面が表示されます。

参考URL:
http://www.sint.co.jp/
yumi_
質問者

お礼

1、ありがとうございます。出来るということですので、あとは調べてみます。 2、 >レコード型で定義されている定数に対しnullを代入すると >レコード全体の項目に対しnullがセットされる ということでしたので、RETURN BOOLEANで結果を戻して、OUTPUTのレコード型変数は引数にしました。 3、引数の入力箇所が出てきました。 ありがとうございました。

その他の回答 (1)

回答No.1

あまり自信がありませんが・・・。 1、について 可能です。 2、について たぶんNULLに設定することは可能ですが、 NULLの判定ができない(フィールドに対してチェックする方法しかない)と思います。 いっそのこと、そのままNO_DATA_FOUNDをRAISEしてしまう (もちろん呼び出し元のexceptionでCATCHしてあげる) 方法はどうでしょうか? 3、について ObjectBrowserは昔使った記憶をたどると、実行したときに 引数に何を入れるかダイアログのような入力画面が出た ような気がします。

yumi_
質問者

お礼

1、ありがとうございます。出来ることが分かっただけでも助かりましたので、具体的な方法は調べてみます。 2、NO_DATA_FOUNDをRAISEして、呼び出し元のexceptionでCATCHしたりできるのですね。NO_DATA_FOUNDかその他のエラーなのか呼び出し元で知りたかったので役に立ちました。 3、引数の入力箇所が出てきました。 ありがとうございました。

関連するQ&A

  • PL/SQLのファンクションでのOUTの使い方

    ASPで作成したページからストアドプログラムを呼ぶ プログラムを作成しているんですが、 ファンクションの引数で指定するOUTの使い方がわかりません。 OUTに指定した引数(変数)?に値を代入しておくと、 ファンクションの呼び出し元にその値が返るっていう感じ なんでしょうか? 大体でいいので説明してくれる方お願いします。 参考になるサイトなどでもいいのでお願いします。

  • PL/SQLでフェッチでNULLの項目について

    PL/SQLで質問があります。 たとえば複数レコードがあり、フェッチで1件ずつ処理する場合、 1件目で値あり、2件目NULLの場合、2件目のフェッチでINTOした変数はNULLが保証されるでしょうか? それとも1件目の値が残ってしまうでしょうか? サンプルでフェッチのループ内で変数の初期化をしない場合でも、NULLで上書きされているようにみえますが、PL/SQLではありませんが以前ProCでNULLの場合は前のレコードの値が残ってしまったため、PL/SQLは上書きが保証されるのかが気になっています(どちらもオラクルなので似た仕様になるのではと懸念)。 グーグル先生に聞いてみましたが、明記されているサイトがみつからず・・・。 ProCはインディケータでNULLを判定するので値の変数にはNULLの場合、何もしないだけでPL/SQLでは特に初期化を気にすることはないのかもしれませんが、仕様として記述されている箇所が見つからないためご存知の方がいらっしゃいましたら教えて頂けると助かります。 具体的には仕事でそういうコーディングになっている箇所があり、直すべきかそのままで問題ないかを検討しています。 現段階ではあまり修正できる状況ではないため、問題にならなければそのままとしたいと考えています。 サンプルの実行結果上は問題なさそうなのですが、できればプラスアルファの情報が欲しく。

  • PL/SQLのカーソルについて

    PL/SQLのカーソルについて お世話になります。 Oracle11gで開発しています。 初心者です。 下記ストアドプロシージャの「zokuseisyutoku」で取得した 値(入数、重量、才数、ロケーション)を受けて、別のストアドプロシージャ 「Hyouji」の変数(irisuu、jyuryou、saisuu、lokesyon)に代入して得られた 内容をGridviewに表示させたいと思っています。 現在は、別々のストアドプロシージャなのですが、 一つに出来るものなら一つのストアドプロシージャにまとめたいの ですが、どなたかご親切な方、ご教授頂きたく宜しくお願い致します。        記 (1)ストアドプロシージャ1つ目 create or replace procedure zokuseisyutoku ( sItemClass in コード表.品番%type, out_val out pls_integer, out_cursor out sys_refcursor ) as begin if sItemClass is null then open out_cursor for select 入数, 重量, 才数, ロケーション from コード表 ; else open out_cursor for select 入数, 重量, 才数, ロケーション from コード表 where 品番 = sItemClass ; end if; out_val := 1; (2)ストアドプロシージャ2つ目 create or replace procedure Hyouji ( irisuu in 部材表.入数%type, jyuryou in 部材表.重量%type, saisuu in 部材表.才数%type, lokesyon in 部材表.ロケーション%type, out_val out pls_integer, out_cursor out sys_refcursor ) as begin open out_cursor for select b.資材名,b.色,b.種類,b.サイズ,b.棚番号 FROM 部材表 a,資材項目 b WHERE a.ID = b.資材ID AND a.入数 = irisuu AND a.重量 = jyuryou AND a.才数 = saisuu AND ロケーション = lokesyon ; out_val := 1; end; end;

  • PL/SQLで実行したSQLのログの取得について

    ASP(ActiveServerPage)より、PL/SQLのFunctionを実行し、Oracleの複数のTABLEを更新しようとしています。 ASPから実行する際には、引数を渡し、その引数をSQL実行の条件としていますが、実際に実行されたSQL文のログを取得したいのですが、どうしたらよいでしょうか? 何か良い方法をお教えいただけますよう、よろしくお願いいたします。 [実行環境] DB:Oracle8i

  • oracleのfunctionで戻り値複数個

    oracleのストアドプロシージャのファンクションについてですが、 ファンクションは、戻り値を返すことができますが、 それを、複数個返すことはできるのでしょうか。 CREATE [OR REPLACE] FUNCTION ファンクション名(引数 IN データ型[, ...]) RETURN 戻り値の型 IS 宣言部 BEGIN 処理部 END ; お願いします。

  • VBAでの戻り値と引数について

    最近VBAでプログラムを勉強しています。 引数と戻り値について教えてください。 定義としては、 引数:プロシージャに渡される定数、変数、および式。 戻り値:呼び出し元に処理の結果を戻す値。 となっているのですがいまいちピンときません。 SubプロシージャとFunctionプロシージャでその違いがあると思うのですが、具体的にどれが引数でどれが戻り値なのかわかりません。 他のプログラミングも全く経験がない初心者で初歩的な質問ですみませんがご教授お願いします。

  • PL/SQLのグローバル変数保持期間

    PL/SQLのグローバル変数の保持期間についての質問です。 例えば、 パッケージA、 パッケージBが あったとします。 パッケージBには グローバル変数BH、 ファンクションBF があります。 パッケージAからファンクションBFを呼び出します。ファンクションBFの処理で、グローバル変数BHに文字列"こんにちは"をセットします。 ここからです。パッケージAからグローバル変数BHを使用するとき、文字列"こんにちは"は保持されたままなのでしょうか? ファンクションBFで戻り値、又はOUTで呼び出し側パッケージAに返せばいいのですが、訳ありでできません。 このような状況なので、パッケージBのグローバル変数を見ようと考えています。 ファンクションBFは共通関数なので、BFの処理でBHにセットせず、ファンクションAのグローバル変数にセットすることもできません。 ファンクションBFは色々なファンクションから呼び出されているためです。 Java等はインスタンスの概念があるので、上記のような処理は問題ないのですが、PL/SQLでこのような方法は可能でしょうか? 皆さん、お忙しい中申し訳ございませんが、よろしく お願いします。 又、他に良い方法がありましたら、アドバイスお願いします。

  • C#による.NETストアドプロシージャ

    VisualStudio+ODT.netで、C#にて「.NETストアドプロシージャ」を製作しようとしています。 例えばNUMBER型の値を引数で渡してNUMBER型値を返す様なFUNCTIONを作りたいとして、 Oracle側で使う際にNUMBER型の値にはNULL値も有り得るわけですが、 C#側でメソッドの引数や戻り値に、NULL許容型(int?やdecimal?とか)を指定してビルドし、 それをVisualStudioからOracleデータベースへデプロイしようとすると、 ウィザード上のパラメータマッピングのところで、NULL許容型に指定した引数や戻り値に対して Oracle側の適切なデータ型を指定出来なくなってしまいます。 かと言って、C#側メソッドでNULL許容型ではない型を指定してしまいますと、引数へNULL値を 与えると例外が発生してしまいます。 この様な問題に直面されて、何らか解決された方はいらっしゃいますでしょうか?

  • ストアドから得られるレコードセットを、別のストアドで利用したい

    現在、実行するとあるレコードセット(1行1列のみ)を返すストアドプロシージャProc_Aがありますが、このプロシージャを実行して得られる結果を、 別のプロシージャProc_Bで、以下のような形で使用したいと考えています。 ただし、Case文内部でのストアドの実行や、変数へのストアドの実行結果の代入を試しましたが、どちらもうまくいっていません。 なにか、よい解決策があれば、教えていただければ、と思います。 パターンA) Case内部で直接実行 select case Table_A.param_1 when 0 then Exec Proc_A '***','**' else '' end パターンB)いったんパラメータとして取得 declare @values as char(10) execute sp_executesql N'@values = Proc_A ''***'',''**''', N'@values char(10) OUTPUT', @values OUTPUT

  • アクセスadpでのDLookUp関数

    アクセス2003 adpのレポートのあるコントロールのコントロールソースにDLookUp関数を使おうとしています。 =DLookUp("列名","ストアドプロシージャー名") *ストアドプロシージャーの抽出条件にパラメータを設定してあります レポートの「入力パラメータ」にも記入してあります *ストアドプロシージャーを実行した結果のレコードは1つのみです mdbでは =DLookUp("列名","クエリー名") でうまくいっていたのですが adpの場合#エラーになってしまいます 一時ファイルにレコードを追加してそれを引数にすればうまくいくのですが、 できればストアドプロシージャーを引数にしたいと思っています。 どなたかご教授をお願いいたします