create or replace PROCEDURE XML IS l_bfile BFILE; l_clob CLOB; l_parser dbms_xmlparser.Parser; l_doc dbms_xmldom.DOMDocument; l_nl dbms_xmldom.DOMNodeList; l_n dbms_xmldom.DOMNode; l_temp VARCHAR2(1000); TYPE tab_type IS TABLE OF emp%ROWTYPE; t_tab tab_type := tab_type(); BEGIN l_bfile := BFileName('XML_DIR', 'emp.xml'); dbms_lob.createtemporary(l_clob, cache=>FALSE); dbms_lob.open(l_bfile, dbms_lob.lob_readonly); dbms_lob.loadFromFile(dest_lob => l_clob, src_lob => l_bfile, amount => dbms_lob.getLength(l_bfile)); dbms_lob.close(l_bfile); -- make sure implicit date conversions are performed correctly dbms_session.set_nls('NLS_DATE_FORMAT','''DD-MON-YYYY'''); -- Create a parser. l_parser := dbms_xmlparser.newParser; -- Parse the document and create a new DOM document. dbms_xmlparser.parseClob(l_parser, l_clob); l_doc := dbms_xmlparser.getDocument(l_parser); -- Free resources associated with the CLOB and Parser now they are no longer needed. dbms_lob.freetemporary(l_clob); dbms_xmlparser.freeParser(l_parser); -- Get a list of all the EMP nodes in the document using the XPATH syntax. l_nl := dbms_xslprocessor.selectNodes(dbms_xmldom.makeNode(l_doc),'/EMPLOYEES/EMP'); -- Loop through the list and create a new record in a tble collection -- for each EMP record. FOR cur_emp IN 0 .. dbms_xmldom.getLength(l_nl) - 1 LOOP l_n := dbms_xmldom.item(l_nl, cur_emp); t_tab.extend; -- Use XPATH syntax to assign values to he elements of the collection. dbms_xslprocessor.valueOf(l_n,'EMPNO/text()',t_tab(t_tab.last).empno); dbms_xslprocessor.valueOf(l_n,'ENAME/text()',t_tab(t_tab.last).ename); dbms_xslprocessor.valueOf(l_n,'JOB/text()',t_tab(t_tab.last).job); dbms_xslprocessor.valueOf(l_n,'MGR/text()',t_tab(t_tab.last).mgr); dbms_xslprocessor.valueOf(l_n,'HIREDATE/text()',t_tab(t_tab.last).hiredate); dbms_xslprocessor.valueOf(l_n,'SAL/text()',t_tab(t_tab.last).sal); dbms_xslprocessor.valueOf(l_n,'COMM/text()',t_tab(t_tab.last).comm); dbms_xslprocessor.valueOf(l_n,'DEPTNO/text()',t_tab(t_tab.last).deptno); END LOOP; -- Insert data into the real EMP table from the table collection. -- Form better performance multiple collections should be used to allow -- bulk binding using the FORALL construct but this would make the code -- too long-winded for this example. DELETE FROM SCOTT.EMP; FOR cur_emp IN t_tab.first .. t_tab.last LOOP INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) VALUES (t_tab(cur_emp).empno, t_tab(cur_emp).ename, t_tab(cur_emp).job, t_tab(cur_emp).mgr, t_tab(cur_emp).hiredate, t_tab(cur_emp).sal, t_tab(cur_emp).comm, t_tab(cur_emp).deptno); END LOOP; COMMIT; -- Free any resources associated with the document now it -- is no longer needed. dbms_xmldom.freeDocument(l_doc); EXCEPTION WHEN OTHERS THEN dbms_lob.freetemporary(l_clob); dbms_xmlparser.freeParser(l_parser); dbms_xmldom.freeDocument(l_doc); END XML;