| loading xml file into table [message #330541] | 
			Mon, 30 June 2008 07:03  | 
		 
		
			
				
				
				
					
						
						yairk30
						 Messages: 14 Registered: May 2006  Location: israel
						
					 | 
					Junior Member  | 
					 | 
		 
		 
	 | 
 
	
		Hey all ! 
I have a procedure that supose to load data from an xml file into a db (9i on windows xp). it goes like this: 
CREATE OR REPLACE
procedure xml_read_file (in_filename in varchar2)
is
 my_dir  varchar2(10) := 'XML_DIR';
  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);   
  v_emp_id number(10);
  v_emp_name  varchar2(50);
  v_birthday date;
src_csid       NUMBER := NLS_CHARSET_ID('UTF8');  
dest_offset    INTEGER := 1;
src_offset     INTEGER := 1;
lang_context   INTEGER := dbms_lob.default_lang_ctx;
warning        INTEGER;
BEGIN
  l_bfile := BFileName(my_dir, in_filename);
  dbms_lob.createtemporary(l_clob, cache=>FALSE);
  dbms_lob.open(l_bfile, dbms_lob.lob_readonly);
  
  dbms_lob.loadclobfromfile(l_clob, l_bfile, dbms_lob.getlength(l_bfile), dest_offset,src_offset, src_csid, lang_context, warning);                        
  
  dbms_lob.close(l_bfile);
  -- make sure implicit date conversions are performed correctly
  dbms_session.set_nls('NLS_DATE_FORMAT','''DD/MM/RR HH24:MI:SS''');
  -- 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  nodes in the document using the XPATH syntax.
  l_nl := dbms_xslprocessor.selectNodes(dbms_xmldom.makeNode(l_doc),'/employees');
  -- Loop through the list and create a new record in a tble collection
  -- for each  record.
  FOR cur_emp IN 0 .. dbms_xmldom.getLength(l_nl) - 1 LOOP
  
    l_n := dbms_xmldom.item(l_nl, cur_emp); 
    -- Use XPATH syntax to assign values to he elements of the collection.
    dbms_xslprocessor.valueOf(l_n,'emp_id/text()',v_emp_id);
    dbms_xslprocessor.valueOf(l_n,'emp_name/text()',v_emp_name); 
     dbms_xslprocessor.valueOf(l_n,'birthday/text()',v_birthday); 
    
insert into emp(emp_id , emp_name , birthday)
values(v_emp_id , v_emp_name , v_birthday)
  END LOOP;
  
  -- Free any resources associated with the document now it
  -- is no longer needed.
  dbms_xmldom.freeDocument(l_doc); 
  
  --remove file to another directory
	commit;
EXCEPTION
  WHEN OTHERS THEN
    dbms_lob.freetemporary(l_clob);
    dbms_xmlparser.freeParser(l_parser);
    dbms_xmldom.freeDocument(l_doc); 
    ROLLBACK;
END;
/
 
Its goes ok but doesnt preform the inserting stuff. 
 
While monitoring in , using dbms's , i've noticed that it stops at the 
 
  dbms_lob.open(l_bfile, dbms_lob.lob_readonly); 
 line. 
In other words, i can't open the file. 
i have to say that similar procedure with another xml file , table and server used to work fine. 
 
Any ideas???? 
 
Thanks , Yair 
 
 [Mod-Edit: Frank added code-tags to improve readability]
		
		
		[Updated on: Mon, 30 June 2008 07:06] by Moderator Report message to a moderator  
 |  
	| 
		
	 | 
 
 
 |