Oracle PLSQL在文件上写输出查询

时间:2017-10-18 10:26:44

标签: oracle plsql

我正在尝试生成此程序表的数据插入语句。

当我执行程序时,我在 myfile.txt 中有这个声明,而我希望得到插入声明的列表

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

我使用的程序是:

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上

1 个答案:

答案 0 :(得分:1)

您正在将SELECT语句写入文件,而不是从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;