Hello,
I am stuck with a problem parsing XML file ... it all went perfectly fine till i have hit a large XML file and now my procedure is returning this error ORA-24331: user buffer too small. I have googled it a bit and i found out that this is causing it dbms_xslprocessor.valueOf.
Anyway could someone help me out a bit? Below you will find my Oracle db version and proceure that i am using.
thank you!
Oracle:
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi
PL/SQL Release 10.2.0.5.0 - Production
CORE 10.2.0.5.0 Production
TNS for Linux: Version 10.2.0.5.0 - Production
NLSRTL Version 10.2.0.5.0 - Production
And the procedure:
PROCEDURE xml is
BEGIN
DECLARE
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_lang_ctx NUMBER := dbms_lob.default_lang_ctx;
v_warning NUMBER;
v_dest_clob CLOB;
v_src_clob BFILE;
v_amount NUMBER;
v_src_offset NUMBER:=1;
v_dest_offset NUMBER:=1;
TYPE tab_type IS TABLE OF klasius_srv%ROWTYPE;
t_tab tab_type := tab_type();
BEGIN
v_src_clob := bfilename( directory => 'XML_DIR', filename => 'srv.xml');
dbms_lob.createtemporary(v_dest_clob, cache=>FALSE);
dbms_lob.open(v_src_clob, dbms_lob.file_readonly);
dbms_lob.loadclobfromfile
(dest_lob => v_dest_clob
,src_bfile => v_src_clob
,amount => dbms_lob.getlength( v_src_clob )
,dest_offset => v_dest_offset
,src_offset => v_src_offset
,bfile_csid => NLS_CHARSET_ID('UTF8')
,lang_context => v_lang_ctx
,warning => v_warning
);
dbms_lob.close(v_src_clob);
dbms_session.set_nls('NLS_DATE_FORMAT','''DD-MON-YYYY''');
l_parser := dbms_xmlparser.newParser;
dbms_xmlparser.parseClob(l_parser, v_dest_clob);
l_doc := dbms_xmlparser.getDocument(l_parser);
dbms_lob.freetemporary(v_dest_clob);
dbms_xmlparser.freeParser(l_parser);
l_nl := dbms_xslprocessor.selectNodes(dbms_xmldom.makeNode(l_doc),'/NewDataSet/Table');
FOR cur_emp IN 0 .. dbms_xmldom.getLength(l_nl) - 1 LOOP
l_n := dbms_xmldom.item(l_nl,cur_emp);
t_tab.extend;
dbms_xslprocessor.valueOf(l_n,'code_x0020_ra',t_tab(t_tab.last).srv);
dbms_xslprocessor.valueOf(l_n,'code_x0020_kat',t_tab(t_tab.last).sif_srv);
dbms_xslprocessor.valueOf(l_n,'Des',t_tab(t_tab.last).de_srv);
dbms_xslprocessor.valueOf(l_n,'Deskriptor_x0020__x0028_ang_x0029_',t_tab(t_tab.last).ang_srv);
END LOOP;
FORALL i IN t_tab.first .. t_tab.last
INSERT INTO klasius_srv VALUES t_tab(i);
COMMIT;
dbms_xmldom.freeDocument(l_doc);
END;
END;