考虑用PRO实现,代码如下:用XMLTYPE类型对XML解析: /* XML file detail<company CID="1"> <ID>0001</ID> <NAME>ORACLE</NAME> <COUNTRY CTID="1"> <COUNTRY_CODE>USA</COUNTRY_CODE> <COUNTRY_CODE>CHINA</COUNTRY_CODE> <COUNTRY_CODE>UK</COUNTRY_CODE> </COUNTRY> </company>*/CREATE DIRECTORY XMLDIR AS 'C:\oracle\XMLDIRTY'; CREATE TABLE CLOB_TABLE (CID NUMBER,CONTENT CLOB);CREATE TABLE XMLCONTENT (XMLID NUMBER PRIMARY KEY, XMLVALUE XMLTYPE);INSERT INTO CLOB_TABLE(CID) VALUES(1); --CONTENT列没有定位器,并且没有数据 INSERT INTO CLOB_TABLE VALUES(2,'THE CONENT WORK FOR CID 2'); --CONTENT列有定位器,并且有数据 INSERT INTO CLOB_TABLE VALUES(3,EMPTY_CLOB());--CONTENT含有定位器,但是没有数据COMMIT;-- 用下面的函数把XML文件转换成CLOB对象,然后使用XMLTYPE类型插入并保存在表XMLCONTENT中./* Author: mantisXF Date: Sep 6, 2008 */CREATE OR REPLACE FUNCTION GET_CLOB_FROM_XML(FILENAME IN VARCHAR2, CHARSET IN VARCHAR2 DEFAULT NULL )RETURN CLOB DETERMINISTIC IS -- DECLARE VARIABLE E.G: CLOB,FILENAME V_XML_FILE BFILE := BFILENAME('XMLDIRTY',FILENAME); -- WORK FOR CONVENTING XML FILE TO CLOB OBJECT V_CLOBCONTENT CLOB; V_LANG_CTX NUMBER := DBMS_LOB.DEFAULT_LANG_CTX; V_CHARSETID NUMBER := 0; V_SRC_OFFSET NUMBER := 1; V_DST_OFFSET NUMBER := 1; V_WARNING NUMBER;
V_STEP VARCHAR2(100) := '';
BEGIN V_STEP := 'DECIDE WHETHER CHARSET IS REQUIRED'; IF CHARSET IS NOT NULL THEN V_CHARSETID := NLS_CHARSET_ID(CHARSET); END IF;
V_STEP := 'MAKE LOB LOCATOR CAN HAVE THE PLACE BY SELECTING RESULT FROM CLOB_TABLE'; SELECT NVL(CONTENT,EMPTY_CLOB()) INTO V_CLOBCONTENT FROM CLOB_TABLE WHERE CID = 1 FOR UPDATE;
V_STEP := 'OPENING XML FILE'; DBMS_LOB.FILEOPEN(V_XML_FILE,DBMS_LOB.FILE_READONLY);
V_STEP := 'CONVERTING XML FILE TO CLOB OBJECT'; DBMS_LOB.LOADCLOBFROMFILE(V_CLOBCONTENT,V_XML_FILE,DBMS_LOB.GETLENGTH(V_XML_FILE),V_SRC_OFFSET,V_DST_OFFSET,V_CHARSETID,V_LANG_CTX,V_WARNING);
V_STEP := 'CLOSING XML FILE OBJECT'; DBMS_LOB.FILECLOSE(V_XML_FILE);
RETURN V_CLOBCONTENT;
EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Error at: '|| V_STEP); DBMS_OUTPUT.PUT_LINE(SQLCODE || ' : ' || SQLERRM);
<ID>0001</ID>
<NAME>ORACLE</NAME>
<COUNTRY CTID="1">
<COUNTRY_CODE>USA</COUNTRY_CODE>
<COUNTRY_CODE>CHINA</COUNTRY_CODE>
<COUNTRY_CODE>UK</COUNTRY_CODE>
</COUNTRY>
</company>*/CREATE DIRECTORY XMLDIR AS 'C:\oracle\XMLDIRTY';
CREATE TABLE CLOB_TABLE (CID NUMBER,CONTENT CLOB);CREATE TABLE XMLCONTENT (XMLID NUMBER PRIMARY KEY, XMLVALUE XMLTYPE);INSERT INTO CLOB_TABLE(CID) VALUES(1); --CONTENT列没有定位器,并且没有数据
INSERT INTO CLOB_TABLE VALUES(2,'THE CONENT WORK FOR CID 2'); --CONTENT列有定位器,并且有数据
INSERT INTO CLOB_TABLE VALUES(3,EMPTY_CLOB());--CONTENT含有定位器,但是没有数据COMMIT;-- 用下面的函数把XML文件转换成CLOB对象,然后使用XMLTYPE类型插入并保存在表XMLCONTENT中./*
Author: mantisXF
Date: Sep 6, 2008
*/CREATE OR REPLACE FUNCTION GET_CLOB_FROM_XML(FILENAME IN VARCHAR2,
CHARSET IN VARCHAR2 DEFAULT NULL
)RETURN CLOB DETERMINISTIC
IS
-- DECLARE VARIABLE E.G: CLOB,FILENAME
V_XML_FILE BFILE := BFILENAME('XMLDIRTY',FILENAME);
-- WORK FOR CONVENTING XML FILE TO CLOB OBJECT
V_CLOBCONTENT CLOB;
V_LANG_CTX NUMBER := DBMS_LOB.DEFAULT_LANG_CTX;
V_CHARSETID NUMBER := 0;
V_SRC_OFFSET NUMBER := 1;
V_DST_OFFSET NUMBER := 1;
V_WARNING NUMBER;
V_STEP VARCHAR2(100) := '';
BEGIN
V_STEP := 'DECIDE WHETHER CHARSET IS REQUIRED';
IF CHARSET IS NOT NULL THEN
V_CHARSETID := NLS_CHARSET_ID(CHARSET);
END IF;
V_STEP := 'MAKE LOB LOCATOR CAN HAVE THE PLACE BY SELECTING RESULT FROM CLOB_TABLE';
SELECT NVL(CONTENT,EMPTY_CLOB()) INTO V_CLOBCONTENT FROM CLOB_TABLE WHERE CID = 1 FOR UPDATE;
V_STEP := 'OPENING XML FILE';
DBMS_LOB.FILEOPEN(V_XML_FILE,DBMS_LOB.FILE_READONLY);
V_STEP := 'CONVERTING XML FILE TO CLOB OBJECT';
DBMS_LOB.LOADCLOBFROMFILE(V_CLOBCONTENT,V_XML_FILE,DBMS_LOB.GETLENGTH(V_XML_FILE),V_SRC_OFFSET,V_DST_OFFSET,V_CHARSETID,V_LANG_CTX,V_WARNING);
V_STEP := 'CLOSING XML FILE OBJECT';
DBMS_LOB.FILECLOSE(V_XML_FILE);
RETURN V_CLOBCONTENT;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error at: '|| V_STEP);
DBMS_OUTPUT.PUT_LINE(SQLCODE || ' : ' || SQLERRM);
END;