有时需要在存储过程中处理xml,oracle提供了相应的函数来进行处理,xmltype以及相关的函数。
废话少说,上代码:
select xmltype(SIConfirmOutput).extract('//output//tradeinfo//tradeno//text()').getstringval() into v_tradeno from dual;
SIConfirmOutput为字符串变量,也可以为clob类型的变量,此为取单个值的方法。
以下为取xml节点里一组值的办法,feeitemarray节点下包含若干个feeitem:
select extractvalue(VALUE(t), 'feeitem//@itemno') as itemno,
extractvalue(VALUE(t), 'feeitem//@recipeno') as recipeno,
extractvalue(VALUE(t), 'feeitem//@hiscode') as hiscode,
extractvalue(VALUE(t), 'feeitem//@itemcode') as itemcode,
extractvalue(VALUE(t), 'feeitem//@itemname') as itemname,
extractvalue(VALUE(t), 'feeitem//@itemtype') as itemtype,
extractvalue(VALUE(t), 'feeitem//@unitprice') as unitprice,
extractvalue(VALUE(t), 'feeitem//@count') as count,
extractvalue(VALUE(t), 'feeitem//@fee') as fee,
extractvalue(VALUE(t), 'feeitem//@feein') as feein,
extractvalue(VALUE(t), 'feeitem//@feeout') as feeout,
extractvalue(VALUE(t), 'feeitem//@selfpay2') as selfpay2,
extractvalue(VALUE(t), 'feeitem//@state') as state,
extractvalue(VALUE(t), 'feeitem//@fee_type') as fee_type,
extractvalue(VALUE(t), 'feeitem//@preferentialfee') as preferentialfee,
extractvalue(VALUE(t), 'feeitem//@preferentialscale') as preferentialscale,
1,'reg', to_char(now,'yyyymmddhh24miss')||PatientID
from table(XMLSequence(extract(xmltype(SIOutput), 'root//output//feeitemarray//feeitem'))) t;
SIOutput为varchar2变量或者clob变量,'feeitem//@fee_type' 里面有@表示为取属性值而不是取value值,如下面的xml: <feeitem itemno="1" fee_type="0101" preferentialfee="0.0000" preferentialscale="0"></feeitem> 取的是fee_type的值。
另外注意,给oracle传值时如果字符串不能太长(好像是不能超过4000),超长需要转为clob,这一点需要注意,在PB里需要转成blob,在C#里需要转成byte[]来传。
20250614