Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
文件上的Oracle PLSQL写输出查询_Oracle_Plsql - Fatal编程技术网

文件上的Oracle PLSQL写输出查询

文件上的Oracle PLSQL写输出查询,oracle,plsql,Oracle,Plsql,我试图用这个程序生成一个表的数据插入语句 当我执行程序时,我在myfile.txt中有这个语句,而我希望得到插入语句的列表 SELECT 'INSERT INTO TAB_PARAMS (ID,CODE,VALUE,ENV,COMMENT) VALUES (' || id || ',' || '''' || code || '''' || ',' || '''' || value || '''' || ','

我试图用这个程序生成一个表的数据插入语句

当我执行程序时,我在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上

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

那么你面临的问题是什么。?你有什么问题>