Db2 9.1 zos 上的 SOAPHTTPNV
Posted
技术标签:
【中文标题】Db2 9.1 zos 上的 SOAPHTTPNV【英文标题】:SOAPHTTPNV on Db2 9.1 zos 【发布时间】:2013-01-02 15:43:01 【问题描述】:我正在使用函数 SOAPHTTPNV 从 zOS 上的 Db2 9.1 调用 Web 服务。 结果返回ok,但是webservice被调用了多次, 结果集中的每一行(或响应中元素 ROW 的出现)一次。 这是为什么呢?
SQL
SELECT T.NR_KAT, T.PNR_F
FROM
XMLTABLE(
xmlnamespaces ('http://schemas.xmlsoap.org/soap/envelope/' AS
"soap",
'http://schemas/SERVICE/100921' AS "p"),
'$d/soap:Envelope/soap:Body/p:SERVICE_RESPONSE/p:document/p:result/p:ROW'
PASSING XMLPARSE(
DOCUMENT DB2XML.SOAPHTTPNV(
'http://serviceurl',
VARCHAR(''),
VARCHAR('<soap:Envelope
request_simplified
</soap:Envelope>'
))) AS "d"
COLUMNS
NR_KAT VARCHAR(2) PATH 'p:NR_KAT',
PNR_F VARCHAR(12) PATH 'p:PNR_F'
) AS T
;
SPUFI中SQL的结果
NR_KAT PNR_F
---------+---------+---------+---------+------
09 194513051834
08 194515042978
19 194515300398
来自 web 服务的 xml 响应
<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
<Body>
<SERVICE_RESPONSE xmlns="http://schemas/SERVICE/100921">
<document>
<result>
<ROW>
<NR_KAT>09</NR_KAT>
<PNR_F>194513051834</PNR_F>
</ROW>
<ROW>
<NR_KAT>08</NR_KAT>
<PNR_F>194515042978</PNR_F>
</ROW>
<ROW>
<NR_KAT>19</NR_KAT>
<PNR_F>194515300398</PNR_F>
</ROW>
</result>
</document>
</SERVICE_RESPONSE>
</Body>
</Envelope>
【问题讨论】:
【参考方案1】:尝试使用 XMLTABLE 函数的 BY REF 子句:
SELECT T.NR_KAT, T.PNR_F
FROM XMLTABLE(xmlnamespaces ('http://schemas.xmlsoap.org/soap/envelope/' AS "soap",
'http://schemas/SERVICE/100921' AS "p"),
'$d/soap:Envelope/soap:Body/p:SERVICE_RESPONSE/p:document/p:result/p:ROW'
PASSING BY REF XMLPARSE(...))) AS D
COLUMNS NR_KAT VARCHAR(2) PATH 'p:NR_KAT',
PNR_F VARCHAR(12) PATH 'p:PNR_F') AS T
;
【讨论】:
谢谢,但与 BY REF 的结果相同。实际上,我现在注意到服务返回的每一行都调用了一次 + 1。我还尝试从服务中获取结果作为一行,在 httpEnvelope 级别上,然后我看到该服务被调用了两次。【参考方案2】:该症状与 APAR PM52237 中描述的症状相符。 APAR PM52237 解决了为 XMLTABLE 返回的每一行调用 XMLTABLE 函数的参数的问题。请确保您的 z/OS 系统上已安装 PTF UK77921(适用于 DB2 9)。
【讨论】:
以上是关于Db2 9.1 zos 上的 SOAPHTTPNV的主要内容,如果未能解决你的问题,请参考以下文章
DB2 Zos 浅谈 - DB2 LUW VS DB2 Zos