文件上的Oracle PLSQL写输出查询
我试图用这个程序生成一个表的数据插入语句 当我执行程序时,我在myfile.txt中有这个语句,而我希望得到插入语句的列表文件上的Oracle PLSQL写输出查询,oracle,plsql,Oracle,Plsql,我试图用这个程序生成一个表的数据插入语句 当我执行程序时,我在myfile.txt中有这个语句,而我希望得到插入语句的列表 SELECT 'INSERT INTO TAB_PARAMS (ID,CODE,VALUE,ENV,COMMENT) VALUES (' || id || ',' || '''' || code || '''' || ',' || '''' || value || '''' || ','
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;
那么你面临的问题是什么。?你有什么问题>