• ベストアンサー

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文を 書けばよいかお教えください よろしくお願いいたします

  • Oracle
  • 回答数1
  • ありがとう数5

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

  • ベストアンサー
  • 3rd_001
  • ベストアンサー率66% (115/174)
回答No.1

カーソルにINのパラメータが設定できるので、INで受け取った値をカーソル内のWhere句に指定すれば検索可能です。 昔、こんな感じでやりました。 以下のサンプルはscottユーザで流してみてください。 set serveroutput on size 1000000 DECLARE CURSOR emp_cur IS SELECT empno, deptno FROM emp ; emp_rec emp_cur%ROWTYPE; CURSOR dept_cur ( in_deptno IN NUMBER ) IS SELECT deptno, dname FROM dept WHERE deptno = in_deptno ; dept_rec dept_cur%ROWTYPE; BEGIN OPEN emp_cur; LOOP FETCH emp_cur INTO emp_rec; EXIT WHEN emp_cur%NOTFOUND; OPEN dept_cur ( emp_rec.deptno ); FETCH dept_cur INTO dept_rec; IF dept_cur%NOTFOUND THEN DBMS_OUTPUT.PUT_LINE('dept not found : ' || emp_rec.deptno); ELSE DBMS_OUTPUT.PUT_LINE(emp_rec.empno); DBMS_OUTPUT.PUT_LINE(dept_rec.dname); END IF; CLOSE dept_cur; END LOOP; CLOSE emp_cur; EXCEPTION WHEN OTHERS THEN DECLARE ERROR_CODE NUMBER := SQLCODE; ERROR_MSG VARCHAR2(300) := SQLERRM; BEGIN DBMS_OUTPUT.PUT_LINE('*** ORA-ERROR IN THE EXCEPTION ***'); DBMS_OUTPUT.PUT_LINE('ERROR CODE : ' || TO_CHAR(ERROR_CODE)); DBMS_OUTPUT.PUT_LINE('ERROR MSG : ' || ERROR_MSG); END; END; /

vierijapan
質問者

お礼

丁寧な解説ありがとうございます ためしてみます ありがとうございました

関連するQ&A

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

    すみません。 PL/SQLにて以下のようなカーソルがあるのですが、 引数のpJYOKENをWHERE条件に追加することはできないでしょうか。 pJYOKENには(属性 = 0)のような条件が入っています。 条件はその都度違ったものが入ってくるイメージです。 cursor CURテスト (pJYOKEN IN VARCHAR2) IS SELECT 社員コード FROM テストマスタ WHERE 会社ID = '001' AND 区分 = 1; rcテスト CURテスト%rowtype; よろしくお願い致します。

  • 動的な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.?????はないでしょうか? いろいろ調べたのですが手に負えず。 どなたか教えてください。

  • PL/SQLにてカーソル名を変数に

    PL/SQLにて、カーソル名を変数にしたいのですが、どうすればよいのでしょうか? 具体的には以下のとおりです。 DECLARE CURSOR Cur1 IS SELECT K1,K2 FROM EMP; BEGIN FOR Cur_Rec1 IN Cur1     Cur_Rec1.K1 DBMS_OUTPUT.PUT_LINE(Cur_Rec1.K1); ★ END LOOP; END; ★の部分の「Cur_Rec1.K1」を「Cur_Rec1.K2」として、置き換えて使用したいのです。(2回書きたくない) 初心者で、申し訳ないです。どうか、ご教授ください。

  • PL/SQLでカーソルを指定する方法

    以下の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; どうかよろしくお願いします。

  • テーブルを結合するとき

    MySQLのSQL文です。 TblAのID、Nmがあり、TblBにID、Adrsがあるとします。 次の2つのSQL文の結果は同じになります。 そもそもこの2つの書き方には何か違う意味があるのでしょうか。 CREATE View TblC1 as SELECT TblA.ID, TblA.Nm, TblB.Adrs FROM TblA INNER JOIN TblB ON TblA.ID = TblB.ID; CREATE View TblC2 as SELECT TblA.ID, TblA.Nm, TblB.Adrs FROM TblA ,TblB where TblA.ID = TblB.ID; また、TblAにはありTblBには含まれないレコードを出すときは CREATE View TblC3 as SELECT TblA.ID, TblA.Nm, TblB.Adrs FROM TblA LEFT JOIN TblB ON TblA.ID = TblB.ID; 逆にTblBにありTblAには含まれないレコードを出すときは CREATE View TblC4 as SELECT TblA.ID, TblA.Nm, TblB.Adrs FROM TblA RIGHT JOIN TblB ON TblA.ID = TblB.ID; としています。 これをwhereを使った書き方ではできないのでしょうか。

    • ベストアンサー
    • MySQL
  • 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でFROM句に変数を使いたい

    PL/SQL初心者なので方法があるかないかもわかりません。 SELECT TABLE_NAME FROM USER_TABLES で取得したテーブルを PQL文に使用したいのですが可能ですか? 一応動的(DBMS_SQLを使用した方法)にSQLを作成することはできたのですが パフォーマンスを考えると静的に使用したいのです。 動的、静的の表現でいいのかわかりませんが普通に PL/SQL中にSQL文を使いたいんですがいかがでしょうか?

  • カーソルについて

    カーソルってオープン時に該当データの全レコードセットを取得するんでしょうか?。 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】SQL文が長すぎてSELECTできない

    oracle9iのpl/sqlでSELECT文を発行し 取得したカーソルを返す処理をしています。 where句が動的になる為 実行するSQL文が長くなり ORA-06502: PL/SQL: 数値または値のエラー: 文字列バッファが小さすぎます。が発生しました のエラーが発生します。 そこで、SQL文の部分をCLOB型にしたり SQL文を「||」でつなげたり してみましたが、どちらもエラーになりました。 長すぎるSQL文を実行するには どうしたらよいでしょうか? 以下ソースです。(左側の数字は行数です) ----------------------------------- 1 PROCEDURE テスト(O_カーソル IN OUT 情報カーソル) IS 2 TYPE curType IS REF CURSOR; 3 tmpCur curType; 4 sqlStr VARCHAR2(32767); 5 6 7 BEGIN 8 9 sqlStr := 'SELECT ' 10 sqlStr := sqlStr || 'A,B ' 11 sqlStr := sqlStr || 'FROM' <<省略>> 12 OPEN tmpCur FOR sqlStr ←エラー発生 13 O_カーソル := tmpCur; --取得したカーソルを返す 14 END テスト; ----------------------------------- (1)SQL文をCLOB型にしてみる:コンパイルエラー 4 sqlStr CLOB (2)SQL文を「||」でつなげてみる:文字列バッファが小さすぎますでエラー Dim sqlStr1 VARCHAR2(32767); Dim sqlStr2 VARCHAR2(32767); Dim sqlStr3 VARCHAR2(32767); <<省略>> 12 OPEN tmpCur FOR (sqlStr1      || sqlStr2      || sqlStr3 <<省略>> )

  • PL/SQLでのSQL文法

    こんにちは。教えてください。 PL/SQLを使うのが初めで戸惑っています。 まず、PROCEDUREで =========================== BEGIN SELECT NAME FROM TABLE1 WHERE NAME='tanaka'; END; / =========================== このように書いて実行させようとすると、「コンパイルエラー」 「INTO句はこのSELECT文に入ります」というエラーが出ます。 SQLの文法的には間違ってないと思うのですが、INTO句とはこれいかに?? ネットでPL/SQLで検索かけて調べたのですがあまりにも初歩すぎて わかりませんでした。 PL/SQLやORACLEのメーリングリストでお勧めがありましたら教えてください。 よろしくお願いいたします。