• ベストアンサー

動的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