注册
存储过程导出数据为csv文件
技术分享/ 文章详情 /

存储过程导出数据为csv文件

Dora 2024/04/10 897 0 0

测试版本为2023年12月版本,前期较老版本不支持

仅适用于小表记录导出

--  创建过程
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');
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服