-- 创建过程
CREATE OR REPLACE PROCEDURE EXPORT_TABLE_TO_CSV ( FILE_PATH VARCHAR ,
OWNER_NAME VARCHAR ,
CSV_TABLE_NAME VARCHAR,
SCV_FILE_NAME VARCHAR )
IS
SQL_TEXT VARCHAR(8000); --拼接执行过程SQL
LM VARCHAR(8000); --获取插入数据字段定义,拼接至过程中
BEGIN
EXECUTE IMMEDIATE 'CREATE DIRECTORY CSV_FILE AS '''||FILE_PATH||''';';
--获取插入数据字段定义,拼接至过程中,将每个字段值按照特定格式写入到文件中
SET LM =( SELECT LISTAGG('UTL_FILE.PUT(V_OUTPUT_FILE, ''"'' || REPLACE(REC.' ||COLUMN_NAME ||', ''"'', ''""'') || ''"'' || V_SEPARATOR);',CHR(10))
FROM ALL_TAB_COLUMNS
WHERE TABLE_NAME = ''||CSV_TABLE_NAME||''
AND OWNER=''||OWNER_NAME||''
ORDER BY COLUMN_ID );
--过程执行体
SQL_TEXT:= '
DECLARE
V_OUTPUT_FILE UTL_FILE.FILE_TYPE; -- 定义文件类型变量
V_SEPARATOR VARCHAR2(1) := '',''; -- 设置CSV分隔符为逗号
BEGIN
V_OUTPUT_FILE := UTL_FILE.FOPEN(''CSV_FILE'', '''||SCV_FILE_NAME||'.csv'', ''W'');
-- 输出列名
FOR COL IN (SELECT COLUMN_NAME
FROM ALL_TAB_COLUMNS
WHERE TABLE_NAME = '''||CSV_TABLE_NAME||''' -- 需要的表名
ORDER BY COLUMN_ID)
LOOP
UTL_FILE.PUT(V_OUTPUT_FILE, ''"'' || COL.COLUMN_NAME || ''"'' || V_SEPARATOR);-- 写入列名和分隔符
END LOOP;
UTL_FILE.PUT_LINE(V_OUTPUT_FILE, ''''); -- 写入换行符
FOR REC IN (SELECT * FROM '||OWNER_NAME||'."'||CSV_TABLE_NAME||'")
-- 查询数据并写入文件
LOOP
-- 将每个字段值按照特定格式写入到文件中
'||LM||'
UTL_FILE.PUT_LINE(V_OUTPUT_FILE, ''''); -- 换行
END LOOP;
UTL_FILE.FCLOSE(V_OUTPUT_FILE); -- 关闭文件句柄
EXCEPTION
WHEN OTHERS THEN
IF UTL_FILE.IS_OPEN(V_OUTPUT_FILE) THEN
UTL_FILE.FCLOSE(V_OUTPUT_FILE); -- 在异常发生时关闭文件句柄
END IF;
RAISE; -- 抛出异常
END;
' ;
EXECUTE IMMEDIATE SQL_TEXT;
EXECUTE IMMEDIATE 'DROP DIRECTORY "CSV_FILE" ; ' ;
END;
-- CALL "SYSDBA"."EXPORT_TABLE_TO_CSV"(文件保存路径,模式名,表名,文件名);
-- 创建测试表测试
CREATE TABLE DM_INI AS SELECT * FROM V$DM_INI ;
-- 测试导出SYSDBA.DM_INI表为CSV_DM_DM_INI.CSV文件
CALL "SYSDBA"."EXPORT_TABLE_TO_CSV"('E:\','SYSDBA','DM_INI','CSV_DM_INI');
文章
阅读量
获赞