• ベストアンサー

カーソルを返すストアドパッケージについて。

現在PL/SQLを勉強中です。今回 SELECTした結果のカーソルを返すストアドを作成しておりまして いろいろなページを参考にし、なんとか成功しました。 今回作成したカーソルを返すストアドはストアドパッケージで 作成しました。 これをストアドプロシジャーで作成したいのですがこれは プログラム的に可能ですか? ストアドパッケージ→ストアドプロシジャーに変更するのは 特に意味はありませんが実験的に作成しておりますがまったく うまくいかず。。。 技術的に無理なのでしょうか? かなり初心者なので質問の内容がおかしかったらすいません。

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

  • ベストアンサー
  • oribeyaki
  • ベストアンサー率45% (18/40)
回答No.1

こんにちは 私も初心者の域なんで、なんともいえないんですけど。 パッケージ内にしろ、単独にしろ、プロシージャの引数に、 OUTもしくはINOUTでデータ型指定する必要がありますよね。 パッケージ内だと、そのプロシージャの前に、 カーソル変数を宣言しておけるので、それがそのまま使えますけど、 単独のプロシージャの場合、宣言しようがないので、この方法だとダメです。 タイプオブジェクトにカーソル変数作れるかというと、それも出来ません。 (Ver8.1.7.0.0) タイプオブジェクトにテーブル構造作ってそちらに値を渡す方法なら出来ます。 (カーソルを渡すという主旨から外れてしまいますが。) 私が知る限りではこのような感じです。 最近PL/SQL触ってないので、間違ってるかも知れませんが。 後、Oracle関連の技術的なことは、参考URLの掲示板を検索してみてはいかがでしょうか。 質問する場合には、登録が必要ですが。 また、サンプルコードも置いてあるので勉強になりますよ。

参考URL:
http://otn.oracle.co.jp/
karin16jp
質問者

お礼

ありがとうございます。 >タイプオブジェクトにカーソル変数作れるかというと、それも出来ません。 そうなんです。 ストアドプロシージャの引数に、カーソルのデータ型を どのように指定するかがかなり迷っていたのです。。。 でもやっぱり無理だったんですね。 参考リンクもありがとうございました。早速登録して 勉強します。

その他の回答 (1)

  • funamin
  • ベストアンサー率0% (0/6)
回答No.2

可能だと思います。 パッケージとは、基本的にストアドファンクション、ストアドプロシジャを共有宣言も含めひとつにまとめたものであるので、ストアドプロシジャー単独でも 大丈夫だと思います。

関連するQ&A

  • 動的なSQLからカーソルを返す。

    下記のようなカーソルを返すパッケージがあったとします。 CREATE OR REPLACE PACKAGE TEST AS CURSOR C1 IS SELECT * FROM テーブル; TYPE TC1 IS REF CURSOR RETURN C1%ROWTYPE; PROCEDURE P_TEST(in条件 IN CHAR, CU OUT TC1); END; CREATE OR REPLACE PACKAGE BODY TEST IS PROCEDURE P_TEST(in条件 IN CHAR, CU OUT TC1) AS sqlStr VARCHAR2(1000); cur NUMBER; r NUMBER; BEGIN cur := DBMS_SQL.OPEN_CURSOR; sqlStr := 'OPEN CU FOR SELECT * FROM テーブル WHERE 条件 = ' || in条件; DBMS_SQL.PARSE(cur, sqlStr, DBMS_SQL.NATIVE); DBMS_SQL.DEFINE_COLUMN(cur, 1, CU); r := DBMS_SQL.EXECUTE(cur); DBMS_SQL.CLOSE_CURSOR(cur); END; SELECTした結果のカーソル(CU)をクライアントで取得したいのですけど 技術的に可能でしょうか? ストアドのコンパイル時に→DBMS_SQL.DEFINE_COLUMN(cur, 1, CU);が エラーとなります。 DBMS_SQL.DEFINE_COLUMNではカーソルタイプは取得できないとわっかたの ですがカーソルを取得する為のDBMS_SQL.DEFINE_COLUMNにかわる DBMS_SQL.?????はないでしょうか? いろいろ調べたのですが手に負えず。 どなたか教えてください。

  • ストアドでのレコード処理

    ストアドの中でSELECT文を発行してその出力結果を元に次のSQL文を作成したいと思っています。そこでSQL文の出力結果をACCESSから呼んだ時の様にRECORD SETの処理の様な記述をしたいと思っています。そこでストアドの中で『SELECT [項目] from XXXX』の [項目]を参照するにはどの様な記述をすればいいのでしょうか。宜しくお願い致します。

  • ストアドプロシージャ_カーソルのヒット件数

    いつもお世話になっています。 SQLServer7.0です。 ストアドプロシージャでカーソルを使用し、オープンしたカーソルの件数を調べたいのですがうまくいきません。 Declare curs2 cursor for Select [項目名] From [テーブル名] Where [検索条件] Open curs2 Print @@CURSOR_ROWS この「@@CURSOR_ROWS」変数でヒット件数を取得できるように参考書では書いてあるのですが、実際Printしてみると、カーソルをオープンする前だと 0 で、オープンした後だと-1 です。 特にエラーだとか、対象データがないというわけではありません。実際その後ヒットした件数分行う処理は正常に出来ています。 ただ、どうしても処理を行う前に件数を知りたいのです。カーソルの変数だけでは取れないとなると セレクトしたカーソルと全く同じセレクトを実行して@@ROWCOUTで取るしかないかなって思ってるのですが・・・。どうも建設的ではないなって思ってます。 カーソルの件数を取得するにはどうしたらよいのでしょうか?

  • PL/SQLで作成したストアドの起動方法について(バッチ処理)

    業務システムにおいて、夜間バッチ用のストアドプログラム(PL/SQL)を作成するのですが、そもそもバッチの起動方法等が理解できていません。 PL/SQL関連の書籍はいくつか読み、プログラム自体は理解できるのですが、具体的にどのような仕組みで起動をかけるかがわかりません。 (スケジューラで起動させて、後に照会画面で実施結果を確認できるとは聞きました) もし、バッチ処理に関して詳しく解説された書籍をご存知であれば、ご紹介いただきたいです。

  • MYSQLでストアドプロシージャの引数を二つ

    MYSQL初心者で参考書にかじりついてプログラミングしています。 主にDBの内容をPHPで吐き出させるといった使い方をしています。 SQL文があまりにも長ったらしくなってきたのでストアドプロシージャを使いたいのですが、使っているSQL文が (SELECT * FROM .変数. WHERE .変数. LIKE '.変数.') UNION (SELECT * FROM .変数. WHERE .変数. LIKE '.変数.'); となっており、引数を複数使えないとスッキリさせられない状況です。 ストアドプロシージャで複数の引数を設定することはできないのでしょうか?

    • ベストアンサー
    • MySQL
  • PL/SQL カーソルのFROM句にカーソル

    もしご存知の方がいればお教えください。 ORACLE PL/SQLで CURSOR cur_a AS SELECT a FROM TBLA とカーソルを宣言し そのカーソルを他のカーソルで 使用することは可能でしょうか? 以下のような感じで CURSOR cur_B AS SELECT b FROM TBLB,cur_a ご存知の方が居たら どのようなSELECT文を 書けばよいかお教えください よろしくお願いいたします

  • PL/SQLについて

    PL/SQLについて お世話になります。 現在Oracle 11gと.Net C#で開発をしている物です。 正直どちらも初心者で悪戦苦闘している日々ですが、 PL/SQLのカーソルについて知りたい事があります。 PL/SQLでカーソルを作成しました。 そしてその同一ストアドプロシージャ文の中で、 先のカーソルの結果で得られた値から別の新たなカーソル でまた新たな結果を返すと言う様な、二重カーソルの様な 事は可能でしょうか。 どなたかご親切な方、ご教授頂きたく宜しくお願い致します。 出来れば、サンプルや、HP等ご紹介頂ければありがたく 思います。

  • カーソルについて

    カーソルってオープン時に該当データの全レコードセットを取得するんでしょうか?。 PL/SQLでVIEWのカーソルをオープンし、ループ処理を行っているんですが、処理速度からして1フェッチごとに毎回SELECT文を発行しているように見受けられます・・・。 ソースはこんな感じです↓。 declare cursor cur_tb_1 is select * from ビュー; begin for rec_tb_1 in cur_tb_1 loop ...処理いろいろ end loop; end; また、このようなケースの場合、VIEWのSELECT結果を一時テーブルにINSERTし、そのテーブルをSELECTするカーソルを使用するほうが 作法的によいのでしょうか?

  • PL/SQLからPL/SQLのコール

    すみませんが、教えて下さい PL/SQLのソースからPL/SQLのソースをCALLする事は可能なのでしょうか? (プロシジャ・ファンクション等のストアドプログラムを使用せず) 知っている方がいましたら、回答をお願いしますm(_ _)m

  • Oracle: PACKAGE BODY の分割

    業務用に10個以上作成したストアドプロシージャ/ファンクションをパッケージとしてまとめようとしています。保守性の観点から、PACKAGE BODY内の各ストアドを、以下のようなイメージで別々のファイルで管理したいと思っています。 が、PACKAGEとBODYの分割はできたものの、BODY内のストアドを別々にすると、エラーとなってしまいます。 そういうことはできないのでしょうか? [xxx_pkg.SQL] CREATE OR REPLACE PACKAGE xxx_pkg IS PROCEDURE procedure_a; PROCEDURE procedure_b; PROCEDURE procedure_c; END xxx_pkg; [xxx_pkg.procedure_a.SQL] PROCEDURE procedure_a IS -- aの処理 END procedure_a; [xxx_pkg.procedure_b.SQL] PROCEDURE procedure_b IS -- aの処理 END procedure_a; [xxx_pkg.procedure_c.SQL] PROCEDURE procedure_c IS -- aの処理 END procedure_c;