我正在尝试创建一个从表中读取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:调用'||'时参数的数量或类型错误”
还有其他方法吗
答案 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;