• ベストアンサー

動的SQLのfetch

動的SQLのfetch やりたいこととしては、下記の(1)のような動的SQLをfetchなりforなりで まわしたいのですがどうしたらいいのでしょうか? よろしくお願いします。 for c_rec in (select table_name from user_tables) loop   v_sql := 'select * from '||rowtbl.table_name; ・・・(1)   ~ 省略 ~ end loop;

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

  • ベストアンサー
  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.1

こんな感じ? CREATE OR REPLACE PROCEDURE query_invoice (p_month VARCHAR2, p_year VARCHAR2) IS TYPE cur_typ IS REF CURSOR; v_inv_cursor cur_typ; -- Declare a cursor variable v_inv_query VARCHAR2(200); v_inv_num NUMBER; v_inv_cust VARCHAR2(20); v_inv_amt NUMBER; BEGIN -- Write dynamic query receiving month and year as parameters -- and using these values to form the table name, for example, inv_APR_2004 v_inv_query := 'SELECT num, cust, amt FROM inv_' || p_month || '_' || p_year || ' WHERE v_inv_num = :g_id'; -- Open a cursor variable OPEN v_inv_cursor FOR v_inv_query USING v_inv_num; -- Fetch row into variables LOOP FETCH v_inv_cursor INTO v_inv_num, v_inv_cust, v_inv_amt; EXIT WHEN v_inv_cursor%NOTFOUND; -- process row here END LOOP; CLOSE v_inv_cursor; END; / マニュアル「アプリケーション開発者ガイド」の「動的SQLのコーディング」を参照してください。

shaka001
質問者

お礼

回答ありがとうございます。 DB内の全テーブルに対して、テーブルごとにSELECTの結果をファイルに書き込むということをしたかったのですが、上記サンプルはどのように私用したらいいのでしょうか? 具体的には、コメントで挟んである部分をどうしたらいいのかおしえていただきたいのです。 よろしくお願いします。 declare FILE_HANDLE utl_file.file_type; cursor curcol (p_tblname user_tables.table_name%type) is select COLUMN_NAME from user_tab_columns where table_name = p_tblname; v_sql varchar2(1000); v_sel varchar2(1000); v_col varchar2(20); begin for rowtbl in (select table_name from user_tables) loop for rowcol in curcol(rowtbl.table_name) loop if v_sel = '' then v_sel := v_col; else v_sel := v_sel||','||v_col; end if; end loop; v_sql := 'select '||v_sel||' from '||rowtbl.table_name; FILE_HANDLE := UTL_FILE.FOPEN('test',rowtbl.table_name||'.txt','a'); -- ここから for rowresult in (v_sql) loop UTL_FILE.PUT(FILE_HANDLE,rowresult); end loop; UTL_FILE.FCLOSE(FILE_HANDLE); -- ここまで end loop; end; /

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

関連するQ&A

  • 【PL/SQL】LOOPした動的SQLにてFETCHができない

    OracleのPL/SQLで FOR .. LOOP内にて動的SQLを使い SELECTしてきた値を順次FETCHして配列に格納していきたいのですが、 LOOPの1件目のみFETCHがされて2件目以降は全てNULLになってしまいます。SQL文は間違っていません。DBMS_SQL.LAST_ROW_COUNTで1件以上の検索結果があることも確認済みです。 なぜでしょう?教えて下さい! EXECUTE IMMEDIATEをLOOP内で使うことに問題あり? 簡略化した例です。p_noにはすでに文字列格納済みと見てください。 txtsql VARCHAR2(1000); -- 動的SQL mkin INTEGER; fornum1 INTEGER; max_count INTEGER; -- ループされる最大件数 TYPE type_mkin IS TABLE OF NUMBER(10) INDEX BY BINARY_INTEGER; TYPE type_pno IS TABLE OF CHAR(10) INDEX BY BINARY_INTEGER; mkin type_mkin; p_no type_pno; BEGIN FOR fornum1 IN 1 .. max_count LOOP txtsql := 'SELECT SUM(TPSV_NO) ' || ' FROM ACTV || ' WHERE PRI_NO= ' || p_no(fornum1); EXECUTE IMMEDIATE txtsql INTO mkin(fornum1); DBMS_OUTPUT.PUT_LINE(mkin(fornum1)); END LOOP; END;

  • PL/SQLでテーブル名に変数を使いたい

    下記のようにV_TABLE_NAMEに不定のテーブル名で使用したい ご存知の方は教えて頂けないでしょうか?V_TABLE_NAMEに取得したテーブルをセットし、データの件数を取得するPL/SQL CURSOR C_CUR IS SELECT COUNT (*) FROM V_TABLE_NAME; BEGIN for ・・・・・ loop ・・・  ・・・ V_TABLE_NAME := GET_TABLE;  OPEN C_CUR;  FETCH C_CUR into w_count; CLOSE C_CUR; end loop;

  • 変数が選択リストにありません

    変数が選択リストにありません 下記のコードを実行すると「変数が選択リストにありません」というエラーが出てしまいます。 SELECT文とFETCHのINTOの変数の個数が一致していない場合にこのエラーは出るということらしいのですが、問題ないように思うのです。 下記コードで何が問題になっているのか教えてください。 よろしくお願いします。 set serveroutput on; declare -- 各テーブルの全カラムを取得 cursor curcol (p_tblname user_tables.table_name%type) is select COLUMN_NAME,DATA_TYPE from user_tab_columns where table_name = p_tblname ; v_sql varchar2(1000); -- SQL文 v_col varchar2(1000); -- カラム名 v_val varchar2(1000); -- 取得データ v_tblname varchar2(20); -- テーブル名 v_RstExec integer; v_CursorID integer; begin v_col := ''; v_tblname := 'sample'; -- 取得テーブルのカラムを取得 for rowcol in curcol(v_tblname) loop -- 取得カラムをCSV形式に変換 if v_col is null then v_col := rowcol.COLUMN_NAME; else v_col := v_col||'||'',''||'||rowcol.COLUMN_NAME; end if; end loop; dbms_output.put_line(v_col); -- SQL作成 v_sql := 'select '||v_col||' from '||v_tblname; v_CursorID := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(v_CursorID, v_sql, DBMS_SQL.NATIVE); v_RstExec := DBMS_SQL.EXECUTE(v_CursorID); LOOP IF DBMS_SQL.FETCH_ROWS(v_CursorID) = 0 THEN EXIT; END IF; DBMS_SQL.COLUMN_VALUE(v_CursorID, 1, v_val); DBMS_OUTPUT.PUT_LINE(v_val); END LOOP; DBMS_SQL.CLOSE_CURSOR(v_CursorID); end; /

  • SQL xx件目からxx件目までを抽出したい

    SQLを習いはじめました。 ユーザーIDが100件あるテーブルの30件目~50件目の ユーザIDを抽出し、別テーブルに登録をしたいと思っています。 『このxx件目からxx件目まで』の抽出のしかたがわかりません。 どなたかわかる方がいましたら教えてください。 DECLARE CURSOR cursor_name IS SELECT USER_ID FROM TBL_USERID ; getid VARCHAR2(16); ryear NUMBER := '2008'; ryear2 NUMBER := '08'; rmonth NUMBER; rday NUMBER; usercnt NUMBER; rcnt NUMBER := '0'; --処理開始 BEGIN SELECT count(USER_ID) INTO usercnt FROM TBL_USERID ; OPEN cursor_name ; LOOP FETCH cursor_name INTO getid ; EXIT WHEN cursor_name%NOTFOUND; --月でループ(1~12月) For rmonth IN 1..12 LOOP --日でループ(1~22日) For rday IN 1..22 LOOP --スケジュール1件目 rcnt := (rcnt + 1); INSERT INTO TBL_SCH ( SCHEDULE_ID ,USER_ID ,UPDATE_DATETIME ) VALUES ( ryear || Trim(TO_CHAR(rmonth,'00')) || Trim(TO_CHAR(rday,'00')) || Trim(TO_CHAR(rcnt,'00000000')) ,'getid' ,SYSTIMESTAMP ); END LOOP; END LOOP; END LOOP ; CLOSE cursor_name ; END ;

  • postgres ストアドファンクションないのレコードの取得について

    質問させていただきます pg/plsqlのストアドファンクション内で 受け取った引数を sql := select * from hoge; FOR rec IN EXECUTE sql LOOP return rec.col;     <<<この部分で END LOOP; return; rec.引数名のようにして 引数から取得した 列を指定したいのですが、そのまま入れると そのような列はありませんと言うような返事を 返されてしまいます。 うまくやる方法はないものでしょうか? よろしくお願いします。

  • dbからデータをとりだす際、sqlのfetch結果をjavaでとりだす

    dbからデータをとりだす際、sqlのfetch結果をjavaでとりだすのは可能なのでしょうか? (チェックボックス 空欄) sql (チェックボックス 空欄) begin; declare cursor_name cursor for select * from user_ad; fetch forward 3 from cursor_name; //この結果をjavaでとりだしたい 注:この後、PostgreslqMyAdminで表そうとしたら、commitしたら表せない!! ふつうに、select文でとりだすなら分かるのですが。。。 con = Connectionのこと 処理ソースは、、、 必要最小限な部分だけ、記述しています。 PrepareStatement stmt = null; try { String sql = "select user_id from user_ad"; this.stmt = con.prepareStatement(sql); //ループでデータとりだし ResultSet rs = stmt.executeQuery(); while(rs.next()) { String userId = rs.getString("user_id"); } }catch(Exception e) { System.out.println(e.getMessage()); System.out.println(e.getStackTrace()); } fetchでとりだそうとすると、カーソルが関係していて、処理自体、変わってくるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • 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での参照

    PL/SQLで、複数データをLOOPで 読み込む処理を行います。 TYPE T_CHR IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER; vc_data T_CHR; FOR cur_01 IN rec_01 LOOP vc_data(1) := rec_01.SHOHIN1 vc_data(2) := rec_01.SHOHIN2 vc_data(3) := rec_01.SHOHIN3 vc_data(4) := rec_01.SHOHIN4 ・・・・・ vc_data(50) := rec_01.SHOHIN50 END LOOP; 上記のような処理をしたいのですが、vc_dataに セットする処理を、Loopでできないですか? FOR n_count IN 1..50 LOOP vc_data(n_count) := rec_01(n_count); END LOOP; のようなかんじで。。。 今は50個羅列したままです。 でも、上のような処理は、エラーでした。 rec_01は、 rec_01.SHNNO1 のように、列名を指定する以外方法はないのでしょうか? 初歩的な質問ですみませんが、よろしくおねがいします。

  • PL/SQLでFROM句に変数を使いたい

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

  • PL/SQLの基礎的な質問ですが・・

    こんばんわ! PL/SQLの超初心者なのですが、以下ように「aaa」という変数に一つ目のselect文の結果を代入して、二つ目のselect文のテーブルにその名前を当てはめたいだけなのです。 DECLAER aaa VARCHAR2(30) BEGIN select max(TABLE_NAME) into aaa from ALL_TABLES Like '***'; select * from aaa END; ところが、結果は「表またはビューが存在しません」となります。 このような使い方はできないのでしょうか? どなたかご教示いただけませんでしょうか?宜しくお願いします。

拒否設定
このQ&Aのポイント
  • 拒否設定とは、ブラザー製品で利用できる機能の一つです。
  • 拒否設定を使うことで、指定したデータやユーザーからのアクセスを制限することができます。
  • セキュリティやプライバシーを保護するために重要な機能となっています。
回答を見る