DBMS_XMLGEN.GETXML + DBMS_LOB.SUBSTR + UTL_FILE导表数据XML文件

贴出我写的Function: CREATE OR REPLACE FUNCTION F_EXPORT2XML RETURN INTEGER IS  RESULT INTEGER := 0;  XMLHDL DBMS_XMLGEN.CTXTYPE;  --LINE   VARCHAR2(2000);  LINE   LONG;  XMLDOC CLOB;  --XMLTEXT VARCHAR2(32767);  XMLTEXT LONG;  --STR            VARCHAR2(32767);  XML_FILE       UTL_FILE.FILE_TYPE;  TOTAL_LENGHS   INTEGER;  SUBSECTION     INTEGER := 0;  SUBSECTION_LEN INTEGER := 0;  IDX2           INTEGER;  CHARWIDTH      INTEGER;  SQLERRTEXT     VARCHAR2(32767);BEGIN  CHARWIDTH := LENGTHB('汉');  -- create ctxhandle  --XMLHDL := DBMS_XMLGEN.NEWCONTEXT('SELECT * FROM SRV_RES');  XMLHDL := DBMS_XMLGEN.NEWCONTEXT('SELECT * FROM INFO_TOKEN where rownum < 20000 order by tk_serial');  -- custerm config  --DBMS_XMLGEN.SETMAXROWS(XMLHDL, 10);  /*  DBMS_XMLGEN.SETROWSETTAG(XMLHDL, 'Packet');  DBMS_XMLGEN.SETROWTAG(XMLHDL, 'Record');*/  DBMS_XMLGEN.SETNULLHANDLING(XMLHDL, DBMS_XMLGEN.EMPTY_TAG);
  -- generate xml format data into clob  XMLDOC       := DBMS_XMLGEN.GETXML(XMLHDL);  TOTAL_LENGHS := LENGTH(XMLDOC);  IF TOTAL_LENGHS > 0 THEN    -- display the xml content    SUBSECTION_LEN := 32767 / CHARWIDTH;    LOOP      IF XMLTEXT IS NOT NULL THEN        XMLTEXT := XMLTEXT ||                   DBMS_LOB.SUBSTR(XMLDOC, 32767,                                   SUBSECTION_LEN * SUBSECTION + 1);            ELSE        XMLTEXT := DBMS_LOB.SUBSTR(XMLDOC, 32767,                                   SUBSECTION_LEN * SUBSECTION + 1);      END IF;      EXIT WHEN XMLTEXT IS NULL;      LOOP        EXIT WHEN XMLTEXT IS NULL;        IF UTL_FILE.IS_OPEN(XML_FILE) = FALSE THEN          XML_FILE := UTL_FILE.FOPEN('EXPDIR', 'xml_info_token.xml', 'w',                                     32767);        END IF;        IDX2 := INSTR(XMLTEXT, CHR(10));        IF IDX2 = 0 THEN          EXIT;        ELSE          LINE := SUBSTR(XMLTEXT, 1, IDX2 - 1);        END IF;        UTL_FILE.PUT_LINE(XML_FILE, LINE);        XMLTEXT := SUBSTR(XMLTEXT, IDX2 + 1);      END LOOP;      SUBSECTION := SUBSECTION + 1;    END LOOP;    IF XMLDOC IS NOT NULL AND DBMS_LOB.ISTEMPORARY(XMLDOC) = 1 THEN      DBMS_LOB.FREETEMPORARY(XMLDOC);    END IF;    IF XMLDOC IS NOT NULL AND DBMS_LOB.ISTEMPORARY(XMLTEXT) = 1 THEN      DBMS_LOB.FREETEMPORARY(XMLTEXT);    END IF;      -- get row count    --DBMS_OUTPUT.PUT_LINE(DBMS_XMLGEN.GETNUMROWSPROCESSED(XMLHDL));    UTL_FILE.FCLOSE(XML_FILE);    -- close ctxhandle    DBMS_XMLGEN.CLOSECONTEXT(XMLHDL);  END IF;  RESULT := 1;  RETURN(RESULT);EXCEPTION  WHEN OTHERS THEN    SQLERRTEXT := SQLERRM;    IF XMLDOC IS NOT NULL AND DBMS_LOB.ISTEMPORARY(XMLDOC) = 1 THEN      DBMS_LOB.FREETEMPORARY(XMLDOC);    END IF;    IF XMLDOC IS NOT NULL AND DBMS_LOB.ISTEMPORARY(XMLTEXT) = 1 THEN      DBMS_LOB.FREETEMPORARY(XMLTEXT);    END IF;    IF UTL_FILE.IS_OPEN(XML_FILE) THEN      UTL_FILE.FCLOSE(XML_FILE);    END IF;    RETURN(RESULT);END F_EXPORT2XML;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/11136/viewspace-672202/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/11136/viewspace-672202/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值