SOAPHTTPNV на Db2 9.1 zos

Я вызываю веб-сервис из Db2 9.1 в zOS, используя функцию SOAPHTTPNV. Результат возвращается в порядке, но веб-сервис вызывается несколько раз, по одному разу для каждой строки в наборе результатов (или появления элемента 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
;

Результат SQL в SPUFI

NR_KAT  PNR_F
---------+---------+---------+---------+------
09      194513051834
08      194515042978
19      194515300398

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>

person user1943261    schedule 02.01.2013    source источник


Ответы (2)


Попробуйте использовать предложение BY REF функции XMLTABLE:

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
;
person Ulrich Seelbach    schedule 08.01.2013
comment
Спасибо, но тот же результат с BY REF. На самом деле я заметил, что служба вызывается один раз + 1 для каждой строки, возвращаемой службой. Я также попытался получить результат от службы в виде одной строки на уровне httpEnvelope, затем я вижу, что служба вызывается дважды. - person user1943261; 09.01.2013

Симптом совпадает с описанным в APAR PM52237. APAR PM52237 устранил проблему, из-за которой аргументы функции XMLTABLE вызывались для каждой строки, возвращаемой XMLTABLE. Убедитесь, что в вашей системе z/OS установлен PTF UK77921 (для DB2 9).

person Rick Chang    schedule 12.01.2013