动态解析XML

时间:2016-04-20 10:14:57

标签: xml oracle xml-parsing

我正在尝试创建一个从表中读取XML并解析值并将值插入另一个表的过程

 CREATE OR replace PROCEDURE Xml_parser 
    AS 
      TYPE cur_type IS ref CURSOR; 
      vxml         XMLTYPE; 
      vvalue       VARCHAR2(100); 
      l_cur_string VARCHAR2(150); 
      vxpath       contractresignxml_master.xpath%TYPE; 
      vnodename    contractresignxml_master.nodename%TYPE; 
      select_cur   CUR_TYPE; 
      verror       VARCHAR2(500); 
      CURSOR cur_xml_master IS 
        SELECT xpath, 
               nodename 
        FROM   xml_master; 
    BEGIN 
        SELECT xml_col 
        INTO   vxml 
        FROM   holds_xml; 

        OPEN cur_xml_master; 

        LOOP 
            FETCH cur_xml_master INTO vxpath, vnodename; 

            EXIT WHEN cur_xml_master%NOTFOUND; 

            L_Cur_String := 'Select e.'
                            ||Vnodename||
                            ' From Xmltable(''/changeRequest/customerOrganisation'' Passing Xmltype('
                            ||Vxml||
                            ') columns '
                            ||Vnodename||
                            ' path '
                            ||Vxpath||
                            ' )e';

    OPEN select_cur FOR l_cur_string; 

    LOOP 
        FETCH select_cur INTO vvalue; 

        EXIT WHEN select_cur%NOTFOUND; 


        dbms_output.Put_line (vnodename 
                              ||' ' 
                              ||vxpath 
                              ||':' 
                              ||vvalue); 
    END LOOP; 

    CLOSE select_cur; 
    END LOOP; 

    CLOSE cur_xml_master; 
    END; 

xpath是xml的路径,nodename只是引用xml标记的名称。有几百个xpath我想在某个变量中获取值并插入其他表中 vxml是我要解析的xml。

我正在尝试动态生成一个select语句,该语句为每个xpath解析xml,但收到错误为“Error(27,25):PLS-00306:调用'||'时参数的数量或类型错误”

还有其他方法吗

1 个答案:

答案 0 :(得分:2)

错误是因为您尝试连接XMLType变量,但concatenation operator仅允许字符串(CHAR,VARCHAR2或CLOB)。虽然可以提取CLOB值并包含在引号中,但这不是一个好主意。

相反,您可以将XMLType PL / SQL变量作为绑定变量传递。由于它已经是该类型,因此您不需要XMLType()子句中的passing调用。如果主表格列中的值不包含引号,则还需要引用所提供的path。因此,请将动态语句更改为:

        L_Cur_String := 'Select e."'
                        ||Vnodename||
                        '" From Xmltable(''/changeRequest/customerOrganisation'' '
                        || 'Passing :xml columns "'
                        ||Vnodename||
                        '" varchar2(200) path '''
                        ||Vxpath||
                        ''' )e';

然后传递vxml变量以用作:xml绑定占位符:

OPEN select_cur FOR l_cur_string USING vxml;