以下适用于10G版本
--如果是10G以前,用DBMS_XMLSAVE包代替XMLSTORE
步骤一:创建XML文件存放的目录对象,并把xml文件放入此目录
此例中为T_PRINTCLOBOUT.XML
SQL>create directory XML_DIR as '/opt'
/
步骤二:创建存放数据的表
SQL>create table LQ_XML_TEST
(
USER_ID NUMBER(10),
USER_NAME VARCHAR2(30)
);
步骤三:创建函数
SQL>DECLARE
QRYCTX DBMS_XMLGEN.CTXHANDLE;
dst_loc CLOB;
SAVCTX DBMS_XMLSTORE.CTXTYPE;
N NUMBER;
src_loc bfile := bfilename('XML_DIR', 'T_PRINTCLOBOUT.XML');
amt number := dbms_lob.lobmaxsize;
src_offset number := 1;
dst_offset number := 1;
lang_ctx number := dbms_lob.default_lang_ctx;
warning number;
v_exists PLS_INTEGER := 0;
BEGIN
DBMS_LOB.CREATETEMPORARY(dst_loc, true);--该语句必写,原因不明,否则报错。
DBMS_OUTPUT.PUT_LINE('------------ LOB LOADCLOBFORMFILE EXAMPLE ------------');
dbms_lob.fileopen(src_loc, dbms_lob.file_readonly);
v_exists := DBMS_LOB.fileexists(src_loc);
---- 用于测试文件名以及路径是否正确
IF v_exists = 0 THEN
dbms_output.put_line('FILE NOT EXIST');
ELSE
dbms_output.put_line('FILE AND DIR VALID');
END IF;
----将数据从OS文件加载到CLOB变量-------
dbms_lob.LOADCLOBFROMFILE(dst_loc,
src_loc,
amt,
dst_offset,
src_offset,
dbms_lob.default_csid,
lang_ctx,
warning);
dbms_output.put_line(' Amount specified ' || amt);
dbms_output.put_line(' Number of bytes read from source: ' ||
(src_offset - 1));
dbms_output.put_line(' Number of characters written to destination: ' ||
(dst_offset - 1));
if (warning = dbms_lob.warn_inconvertible_char) then
dbms_output.put_line('Warning: Inconvertible character');
end if;
dbms_lob.filecloseall();
DBMS_OUTPUT.PUT_LINE(dst_loc);
--开始设置加载数据的列
SAVCTX := DBMS_XMLSTORE.NEWCONTEXT('LQ_XML_TEST');
DBMS_XMLSTORE.CLEARUPDATECOLUMNLIST(SAVCTX);
DBMS_XMLSTORE.SETUPDATECOLUMN(SAVCTX, 'USER_ID');--要跟表的列名一致
DBMS_XMLSTORE.SETUPDATECOLUMN(SAVCTX, 'USER_NAME');
N := DBMS_XMLSTORE.INSERTXML(SAVCTX, dst_loc);
DBMS_XMLSTORE.CLOSECONTEXT(SAVCTX);
END;
/
注意:xml文件的节点标签名要与表的字段名一致,否则解析不出来,插入表是空值
--还有update、delete的操作,待续……
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13234423/viewspace-588859/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/13234423/viewspace-588859/