Какой метод ориентирован на производительность при разборе XML и выполнении операций DML с использованием PL / SQL в Oracle? - PullRequest
1 голос
/ 16 февраля 2011

Я сталкивался с различными методами при синтаксическом анализе XML в процедурах PL / SQL, таких как

Первый способ:


CURSOR datahold_xml(student_xmldoc IN xmltype) IS
    SELECT extractvalue(value(t), '/Student/@Enrolled') Enrolled,
           extractvalue(value(t), '/Student/SID') StudentID,
      FROM TABLE(xmlsequence(extract(student_xmldoc , '/Student'))) t;

FOR tempresult_xml IN datahold_xml(student_xmldoc => l_xml) LOOP
    IF UPPER(tempresult_xml.Enrolled) = UPPER('TRUE') THEN
      /* Update Employee Information*/
      UPDATE STUDENTTABLE st
         SET st.firstname = tempresult_xml.FirstName,
             st.lastname  = tempresult_xml.LastName
       WHERE st.SID= tempresult_xml.StudentID;
    ELSE
      /* Do Insert Operation*/
      INSERT INTO STUDENTTABLE (SID,FIRSTNAME,LASTNAME,STATUS)
      VALUES
        (STUDENT_SEQ.NEXTVAL,tempresult_xml.FirstName, tempresult_xml.LastName,'A');
    END IF;
  END LOOP;

Другой использует XSL-процессор как

indoc    := '<Student Enrolled="TRUE">
                    <SID>1</SID>
            </Student>
            <Student Enrolled="FALSE">
             <SID>1</SID>
              <FirstName>James</FirstName>
                    <LName>Cameron</LName>
             </Student>';

indomdoc := dbms_xmldom.newDomDocument(indoc);

  l_nl := dbms_xslprocessor.selectNodes(dbms_xmldom.makeNode(indomdoc),
                                        '//STUDENT[@Enrolled="TRUE"]');
  /* Loop to Update Student Information */
  FOR cur_stu IN 0 .. dbms_xmldom.getLength(l_nl) - 1 LOOP
    l_n := dbms_xmldom.item(l_nl, cur_stu);
    stu_tab.extend;
       stu_tab(stu_tab.first).FIRSTNAME := dbms_xslprocessor.valueOf(l_n,
                                                            'FirstName/text()');
    stu_tab(stu_tab.first).LASTNAME := dbms_xslprocessor.valueOf(l_n,
                                                           'LName/text()');
    stu_tab(stu_tab.first).SID := dbms_xslprocessor.valueOf(l_n,
                                                             'ID/text()');
    /* Update Student Information*/
    UPDATE STUDENTTABLE st
       SET st.firstname = stu_tab(1).FIRSTNAME,
           st.lastname  = stu_tab(1).LASTNAME
     WHERE es.SID= stu_tab(1).SID;
  END LOOP;

Какой из вышеперечисленных методов дает лучшую производительность, используя курсоры или процессор xsl и DOM.

Пожалуйста, дайте мне знать, если есть какие-либо другие лучшие решения для анализа XML.

Я новичок в ORACLE и, следовательно, в процессе обучения ... Хотел попробовать несколько методов и хотел бы узнать, какой из них лучший.

Любая помощь будет принята с благодарностью.

Спасибо, Самир.

1 Ответ

0 голосов
/ 01 марта 2011

Мы используем xmltable для обработки xml-s в plsql.Если вы заботитесь о производительности, попробуйте измерить ее для себя, есть разные методы, одним из которых является автотрассировка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...