在PL/SQL Developer中解析含多变量XML时返回空值,求解决方法
解决PL/SQL解析XML返回空值的问题
嘿,这个问题我太熟悉了——十有八九是命名空间处理不当!PL/SQL解析XML的时候,只要命名空间没正确绑定,就算XML结构完全没问题,也会返回空值,而且还不会抛出任何错误,特别坑人。
先帮你拆解下你的XML结构里的关键细节:
<SomethingProcessRequest>节点有两个命名空间:默认命名空间是http://xmlns.oracle.com/SomethingProcess1,还有前缀ns2对应的http://xmlns.oracle.com/SomethingProcess- 你要提取的
<ns2:p_a>、<ns2:p_b>都是挂在ns2命名空间下的,而它们的父节点<SomethingProcessRequest>属于默认命名空间,这两个都得在解析时明确声明,不然PL/SQL根本找不到对应的节点。
正确的PL/SQL解析示例
假设你用XMLType处理这段XML,下面是两种可行的写法:
方法1:使用XMLQuery绑定命名空间
DECLARE v_xml XMLType := XMLType(' <inputVariable> <part xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="payload"> <SomethingProcessRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="http://xmlns.oracle.com/SomethingProcess" xmlns="http://xmlns.oracle.com/SomethingProcess1"> <ns2:p_a xsi:nil="">1</ns2:p_a> <ns2:p_b xsi:nil="">1</ns2:p_b> </SomethingProcessRequest> </part> </inputVariable>'); v_p_a VARCHAR2(10); BEGIN -- 先在XPath里声明两个命名空间,再定位节点 SELECT XMLQuery( 'declare namespace ns1="http://xmlns.oracle.com/SomethingProcess1"; declare namespace ns2="http://xmlns.oracle.com/SomethingProcess"; /inputVariable/part/ns1:SomethingProcessRequest/ns2:p_a/text()' PASSING v_xml RETURNING CONTENT ).getstringval() INTO v_p_a FROM dual; DBMS_OUTPUT.PUT_LINE('p_a的值是: ' || v_p_a); END; /
方法2:使用XMLType的extract方法指定命名空间
DECLARE v_xml XMLType := XMLType('你的XML内容'); v_p_a VARCHAR2(10); BEGIN v_p_a := v_xml.extract( '/inputVariable/part/ns1:SomethingProcessRequest/ns2:p_a/text()', 'xmlns:ns1="http://xmlns.oracle.com/SomethingProcess1" xmlns:ns2="http://xmlns.oracle.com/SomethingProcess"' ).getstringval(); DBMS_OUTPUT.PUT_LINE('p_a的值是: ' || v_p_a); END; /
为什么之前的写法返回空?
如果你之前直接写类似/inputVariable/part/SomethingProcessRequest/p_a的XPath,PL/SQL会默认认为这些节点属于无命名空间的范畴,但实际上<SomethingProcessRequest>属于默认命名空间ns1,<p_a>属于ns2,完全匹配不上,自然返回空值。
另外提一句:你XML里的xsi:nil=""虽然看起来奇怪,但Oracle解析时会优先取节点的文本值(也就是1),不会因为这个属性导致空值,所以核心问题还是命名空间。
内容的提问来源于stack exchange,提问作者nuuk.me
相关产品推荐
相关产品推荐

