2017-10-18 70 views
0

我试图生成该程序的表的数据插入状态。Oracle PLSQL在文件上写输出查询

当我执行该程序,我在myfile.txt的这一说法,而我希望得到插入statments名单

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

我使用的是PROGRAMM:

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

那么,什么是你所面临的问题。一个循环?什么是你的问题> – XING

回答

1

您正在将SELECT语句写入文件而不是返回的值从选择。

所以,我建议你做下面的事情。

在您的DECLARE块中包含以下内容。

ref_cur sys_refcursor; 
v_insert_query VARCHAR2(1000); 

而不是简单地写这个,

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

取内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

谢谢娜雅克:) –