DBMS_XMLGEN+UTL_FILE+DBMS_LOB生成xml数据文件

本文介绍了一种使用Oracle数据库将表数据导出为XML文件的方法,并通过优化提高了导出效率至少一倍。此过程涉及创建存储过程,利用DBMS_XMLGEN和DBMS_LOB进行XML生成及文件写入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CREATE OR REPLACE FUNCTION F_EXPORT2XML RETURN INTEGER IS
  RESULT     INTEGER := 0;
  XMLSTRING  CLOB := NULL;
  AMOUNT     INTEGER := 32767;
  POSITION   INTEGER := 1;
  CHARSTRING VARCHAR2(32767) := '';

  IDX_CHR10   INTEGER;
  LEN         INTEGER;
  WRITESTRING VARCHAR2(32767);
  FILEHANDLE  UTL_FILE.FILE_TYPE;

  XMLHDL DBMS_XMLGEN.CTXTYPE;

  SQLERRTEXT VARCHAR2(32767);

BEGIN

  XMLHDL := DBMS_XMLGEN.NEWCONTEXT('SELECT * FROM XXXXl');
 
  --open the file in "write" mode 
  FILEHANDLE := UTL_FILE.FOPEN('EXPDIR', 'XML_XXXX.XML', 'w');

  XMLSTRING := DBMS_XMLGEN.GETXML(XMLHDL);

  --Now open the lob data..  
  DBMS_LOB.OPEN(XMLSTRING, DBMS_LOB.LOB_READONLY);
  LOOP
    -- read the lob data  
    DBMS_LOB.READ(XMLSTRING, AMOUNT, POSITION, CHARSTRING);
    IDX_CHR10 := INSTR(CHARSTRING, CHR(10), -1);
    LEN       := LENGTH(CHARSTRING);
    IF (IDX_CHR10 < LEN AND IDX_CHR10 > 0) THEN
      WRITESTRING := SUBSTR(CHARSTRING, 1, IDX_CHR10 - 1);
    ELSE
      WRITESTRING := SUBSTR(CHARSTRING, 1, LEN - 1);
    END IF;
    UTL_FILE.PUT_LINE(FILEHANDLE, WRITESTRING);
    POSITION := POSITION + IDX_CHR10;
  END LOOP;
  RESULT := 1;
  RETURN(RESULT);
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    -- end of fetch, free the lob  
    DBMS_LOB.CLOSE(XMLSTRING);
    DBMS_LOB.FREETEMPORARY(XMLSTRING);
    IF UTL_FILE.IS_OPEN(FILEHANDLE) THEN
      UTL_FILE.FCLOSE(FILEHANDLE);
    END IF;
    RETURN(RESULT);
  WHEN OTHERS THEN
    SQLERRTEXT := SQLERRM;
    IF UTL_FILE.IS_OPEN(FILEHANDLE) THEN
      UTL_FILE.FCLOSE(FILEHANDLE);
    END IF;
    RETURN(RESULT);
END F_EXPORT2XML;

 

经测试,效率比我写的上一个版本至少提供1倍,可能在某些特殊情况下,还是会出现异常,不过不影响大局了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值