2017-10-18 15 views
0

このプログラムを使用しているテーブルのデータ挿入ステートメントを生成しようとしています。Oracle PLSQLファイルに出力クエリを書き込む

私は、インサートたstatments

SELECT 
    'INSERT INTO TAB_PARAMS (ID,CODE,VALUE,ENV,COMMENT) VALUES (' 
    || id 
    || ',' 
    || '''' 
    || code 
    || '''' 
    || ',' 
    || '''' 
    || value 
    || '''' 
    || ',' 
    || '''' 
    || env 
    || '''' 
    || ',' 
    || '''' 
    || comment 
    || '''' 
    || ');' AS "insert.sql" 
FROM 
    tab_params; 

のリストを取得することを期待しながら、私はプログラムを実行すると、私は、myfile.txtのでこの文を持っている私が使用してプログラムの開発は、次のとおりです。

SET SERVEROUTPUT ON; 
DECLARE 

CURSOR column_names_cur 
IS 
SELECT column_name 
FROM user_tab_columns 
WHERE table_name = UPPER('&&1') 
ORDER BY column_id ; 

CURSOR col_select_cur 
IS 
SELECT DECODE(data_type , 
         'DATE' , ''''||'TO_DATE('||''''||'||'||''''||''''||''''||''''||'||'||'TO_CHAR(' , 
         'NUMBER', NULL, 
         'VARCHAR2', ''''''''''||'||' , 
         'XMLTYPE', ''''||'xmltype('||''''||'||'||''''||''''||''''||''''||'||') 

    ||column_name 
    ||DECODE (data_type , 
        'DATE' , ','||''''||'dd-mon-yyyy hh24:mi:ss'||''''||')'||'||'||''''||''''||''''||''''||'||'||''''||','||''''||'||'||''''||''''||''''||''''||'||'||''''||'dd-mon-yyyy hh24:mi:ss'||''''||'||'||''''||''''||''''||''''||'||'||''''||')'||'''' , 
        'NUMBER', NULL , 
        'VARCHAR2' , '||'||''''||''''||''''||'''' , 
        'XMLTYPE', '||'||''''||''''||''''||''''||'||'||''''||')'||'''') sel 
FROM user_tab_columns 
WHERE table_name = UPPER('&&1') 
ORDER BY column_id ; 


w_sql_start    VARCHAR2(4000) ; 
w_sql      VARCHAR2(4000) ; 
w_ok      BOOLEAN ; 
w_file_handle    utl_file.file_type ; 
w_err_text    VARCHAR2(500) ; 
w_col_sep     VARCHAR2(400) := '||'',''||' ; 

BEGIN 

    -- obtain the start of the sql statement 
    FOR column_names_rec IN column_names_cur 
    LOOP 

    w_sql_start := w_sql_start ||column_names_rec.column_name || ',' ; 
    DBMS_OUTPUT.put_line('00'||w_sql_start); 
    END LOOP ; 
DBMS_OUTPUT.put_line('01'||w_sql_start); 

w_sql_start := 'SELECT ''INSERT INTO &&1 ('|| RTRIM (w_sql_start,',') ||') VALUES (' ||''''||'||'; 
DBMS_OUTPUT.put_line('02'||w_sql_start); 

-- obtain individual columns 

    FOR col_select_rec IN col_select_cur 
    LOOP 

    w_sql := w_sql || col_select_rec.sel ||w_col_sep ;   
    DBMS_OUTPUT.put_line('A0'||w_sql); 
    END LOOP ; 

    IF w_sql IS NOT NULL 
    THEN 
    w_sql := SUBSTR(w_sql, 1, LENGTH(w_sql)-7) ;  
    w_sql := w_sql_start || w_sql ||'||'||''''||');'||''''||' AS "insert.sql" FROM &&1 ;' ; 
    DBMS_OUTPUT.put_line('A1'||w_sql); 
    ELSE 
    w_sql := 'SELECT ''Table &&1 not found.'' AS "insert.sql" FROM DUAL; ' ; 
    END IF ; 

-- write the select statement which will genearte the insert statement to a file on the unix box 

--w_file_handle := utl_file.fopen ('/app/webrep/webreports', -- directory , 
w_file_handle := utl_file.fopen ('ALERT_DIR', -- directory , 
           'myfile.txt' , -- filename , 
           'W') ; 

utl_file.putf(w_file_handle , 
      '%s' , 
      w_sql) ; 

utl_file.fclose(w_file_handle) ; 

END ; 
/

oracle 11gR2

+0

を使用してループ内でw_sql内のインサートをフェッチしますか。?あなたの問題は何ですか> – XING

答えて

1

返された値の代わりにSELECT文がファイルに書き込まれています選択から。

したがって、次のことをお勧めします。

ブロックをDECLAREブロックに含めます。

ref_cur sys_refcursor; 
v_insert_query VARCHAR2(1000); 

、代わりに、単純にこれを書いている、

utl_file.putf(w_file_handle , 
      '%s' , 
      w_sql) ; 

だから、あなたが直面している問題は何であるREF CURSOR

OPEN ref_cur FOR w_sql; 

LOOP; 

     FETCH ref_cur INTO v_insert_query; 
     EXIT WHEN ref_cur%NOTFOUND; 
     utl_file.putf(w_file_handle , 
      '%s' , 
      v_insert_query) ; 

END LOOP; 
+0

ありがとうナヤク:) –

関連する問題