• ベストアンサー

pl/sql ストアドからレコードセットを返す

カーソルを使わずに結果セットを返す方法を知りたいです。 戻り値または、引数で返してもかまいません。 また、同様に動的SQLの結果を返す場合を教えてください。 ※結果セットは複数行の場合です。

  • ikty
  • お礼率40% (2/5)
  • Oracle
  • 回答数1
  • ありがとう数4

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

  • ベストアンサー
  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

http://www.shift-the-oracle.com/plsql/table-function/ パイプライン化した表関数を考えてはどうでしょう。 PL/SQL内で動的なSELECT文をもとにしても対応は可能です。

ikty
質問者

お礼

ありがとうございます 動的SQLの場合 結果セットのカラムが動的に変わる場合 テーブル定義を動的に定義しなければなりませんが、可能でしょうか?

ikty
質問者

補足

ありがとうございます。 いろいろ、調べてみました。マニュアルにも結構載ってました。 bulk collectを使用するのがもっとも適しているような気がします。 pl sqlはカーソルを使用するのが大前提ばかりでちょっと意外でした。 性能を考えるのと、特段カーソルを使用しなければいけない理由は私はDBの 開発でゼロであったため、 pl sqlの説明資料がカーソルありきの説明ばかりなのには 驚いていました。

関連するQ&A

  • PL/SQLについて

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

  • PL/SQLに関して

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

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

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

  • SQLの結果の取得方法について。

    件名の件でいくつか質問があります。 そもそも質問がおかしいということがあるかもしれませんので、もしそうだった場合はご指摘頂けると嬉しいです。 1.SQLの結果の取得方法はResultSetで複数行を取得する方法とカーソル(こっちもクラスはResultSet?)で1行ずつ取得する方法の2種類があるのでしょうか?  ※ PL/SQLなどではなくjavaでの実装になります。  またカーソルで取得する実装方法など参考になるサイトがありましたら教えて頂けると助かります。  PL/SQLのサイトばかりがヒットしてしまいまして・・・。 2.ResultSetで取得した場合、全部のレコードをメモリに展開するのでしょうか? それとも1行(もしくは複数行)毎にDBから実データを取得するのでしょうか。  自分で調べたところではResultSetの実装によるということですが、一度にメモリに展開するドライバもあれば、1行や複数行で展開するドライバもあるということでしょうか。  例えばOracleやDB2やPostgreSQLなどがどのような実装であるかはよく分かりませんでした。  それぞれがどのように実装されているか調べるにはどのようにすればよいでしょうか。 3.巨大なレコード数を結果として取得する際はResultSetで取得するとメモリを圧迫するから、1行ずつ取得した方がパフォーマンスがいいかもしれないとサイトで見たのですが、これはカーソルを使用するということでしょうか?  それともsetFetchSizeで1行指定をしてResultSetで取得するということでしょうか。 4.setFetchSizeは1文にしか反映されないと、どこかのサイトでみたのですが、1文というのはSQL1回ということでしょうか。  同じStatmentで違うSQLを発行する場合は発行毎にsetFetchSizeを呼び出すということでしょうか。  それとも例えば1SQLの結果が100レコードでsetFetchSizeを10にした場合、ループ内で10回setFetchSizeを設定しないといけないということでしょうか? 調べている動機はたくさんのレコードを取得するSQLがあるのですが、フェッチ?カーソル?で取得した方がパフォーマンスがいいのではという話を受けたのですが、その人もあまり詳しくなく、ネットで調べていたのですが、上記のような疑問が中々解消できず質問させて頂いた次第です。 よろしくお願い致します。

    • ベストアンサー
    • Java
  • ROW_NUMBER BY PL/SQL

    こんばんは。 今PL/SQLで開発をしているのですが、PL/SQLでわからないことがあります。 日付のソート順に並べたデータの中から、何行目から何行目までのデータを取得、ということがしたくてROW_NUMBERを使ってSQL文を作成しました。 そのSQL文はきちんと動くのですが(データ取得できる)、それをPL/SQLにてカーソル宣言するとコンパイルエラーになってしまいます。 ROW_NUMBERの部分を削除するとコンパイルは通るので、原因はROW_NUMBERにあるようです。 しかしながら、ROW_NUMBERを使わずに、何行目から何行目までのデータ取得、ということが実装できるのか検討もつきません。 どうしてカーソルでROW_NUMBERが使えないのか? ROW_NUMBERのかわりのようなコマンド、もしくは実装方法が存在するのか? 不明な点は補足させていただきますので、ご教示の程宜しくお願い致します<(_ _)>

  • VBからストアドの動的SQLを呼んで値をレコードセットで取得する方法

    お世話になります。 VBからストアドの動的SQLを呼んで、VB側で値をレコードセットで取得する方法を探しています。 ■ストアド CREATE OR REPLACE PACKAGE SAMPLE as CURSOR c2 IS select A from TBL; TYPE TANTOYOSANDATA IS REF CURSOR RETURN c2%ROWTYPE; PROCEDURE GetNUMBER(C IN NUMBER,           CU OUT TANTOYOSANDATA); end; / -- CREATE OR REPLACE PACKAGE BODY SAMPLE IS PROCEDURE GetNUMBER(C IN NUMBER,             CU OUT TANTOYOSANDATA) IS CUR INTEGER; STATUS INTEGER; ROW_PROCESSED INTEGER; A NUMBER; BEGIN --カーソルをOPENする CUR :=DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(CUR,'SELECT A FROM TBL ',DBMS_SQL.V7); DBMS_SQL.DEFINE_COLUMN(CUR,1,A); ROW_PROCESSED :=DBMS_SQL.EXECUTE(CUR); STATUS :=DBMS_SQL.FETCH_ROWS(CUR); WHILE (STATUS <> 0) LOOP DBMS_SQL.COLUMN_VALUE(CUR,1,A); STATUS :=DBMS_SQL.FETCH_ROWS(CUR); END LOOP; END; END SAMPLE; / ■VB側 Set GoORASESSION = CreateObject("OracleInProcServer.XOraSession") Set GoORADATABASE = GoORASESSION.OpenDatabase(dbname, cnuser, ORADB_DEFAULT) Set Recordset = GoORADATABASE.CreatePLSQLDynaset("Begin SAMPLE.GetTANTOINFO(1,:CU)); end;", "CU", ORADYN_DEFAULT) ' If Recordset.EOF Then Do While Not Recordset.EOF Label11.Caption = Recordset(0) Recordset.movenext  Loop 復帰値をRecordSetで受けて それをまわしながら1レコードずつ取得する方法を探しています よろしくお願いします。

  • PL/SQLの変数について

    困っています。 ホスト引数で :NAME = "あいうえお" としてoracleに渡し、 PL/SQLでNAMEという変数で受け取った後、 Xという変数にその"あいうえお"を'あいうえお' のように、シングルクォーテーションで囲んで入れたいのです。 ですが、 NAME = 'X' としたら文字列として認識してしまい、 NAME = ''X'' としたらPLS-00103のエラーが出てしまいます。 シングルクォーテーションで囲んだ文字列を変数にセットする場合はどのように書いたら宜しいのでしょうか??

  • javaでのストアド呼び出し

    前の質問に似た質問があったのですが、 javaでのストアド呼び出しについて質問です 戻り値(Number型)を返すストアドを呼び出したいのですが ストアドは test で ストアド自体の引数は第1引数から第5引数までが IN で6番目がoutです。 String sql = "{ ? = call test(?,?,?,?,?)}" CallableStatement cstmt = con.prepareCall(sql); cstmt .registerOutParameter( 1, java.sql.Types.INTEGER );  //PL/SQLの戻り値 cstmt .setString( 2, "0" ); cstmt .setString( 3, "0" ); cstmt .setString( 4, "0" ); cstmt .setString( 5, "0" ); cstmt .setString( 6, "0" ); cstmt .execute(); try-catch内に上記ソースを記述し実行すると、エラーになってしまいます cstmt .registerOutParameter( 1, java.sql.Types.INTEGER );の部分が悪いと思うの出すが、PL/SQLのNUMBER型は java.sql.Types.INTEGER  ではいけないのでしょうか それとも書き方そのものがわるいのでしょうか? まわりにJavaが出来る人がいなく、困っています。 どなたか力を貸してください

    • ベストアンサー
    • Java
  • ストアドでのレコード処理

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

  • SQL文(PL・SQL)

    給料表として属性が社員ID、給料適用開始年度、給料適用開始月、給料があります。例えば、 1行目→101、2008、8、200,000 2行目→101、2008、10、210,000 3行目→102、2007、12、190,000 というデータがあった場合に2008年の9月の社員全体の給料合計を求めたいんです。この場合社員101の人は9月時点の給料は200,000で102の人は190,000のままです。このような場合どうSQL or PL/SQLを書けばこの情報を得ることできますか?