You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle 19中通过XQuery动态生成带命名空间SOAP XML的方法

Oracle 19 XQuery动态生成标准SOAP报文实现

你可以直接使用支持动态节点、动态命名空间构造的XQuery语法实现,完全适配你现有参数传入结构,无需硬编码服务名、命名空间或参数节点。

可直接运行的实现代码

select * from XMLTable('
  (: 提取传入的命名空间配置 :)
  let $soap-ns-cfg := $ns/ROW_SET/ROW[Service="SOAP"]
  let $xsi-prefix := $soap-ns-cfg[Code="xsi"]/Code/string()
  let $xsi-uri := $soap-ns-cfg[Code="xsi"]/Value/string()
  let $soapenv-prefix := $soap-ns-cfg[Code="soapenv"]/Code/string()
  let $soapenv-uri := $soap-ns-cfg[Code="soapenv"]/Value/string()
  let $svc-ns-cfg := $ns/ROW_SET/ROW[Service=$service][1]
  let $svc-prefix := $svc-ns-cfg/Code/string()
  let $svc-uri := $svc-ns-cfg/Value/string()
  
  (: 预构造各节点的QName :)
  let $xsi-type-attr := fn:QName($xsi-uri, "type")
  let $envelope-qname := fn:QName($soapenv-uri, fn:concat($soapenv-prefix, ":Envelope"))
  let $header-qname := fn:QName($soapenv-uri, fn:concat($soapenv-prefix, ":Header"))
  let $body-qname := fn:QName($soapenv-uri, fn:concat($soapenv-prefix, ":Body"))
  let $service-qname := fn:QName($svc-uri, fn:concat($svc-prefix, ":", $service))

  return 
    element {$envelope-qname} {
      (: 动态声明所有需要的命名空间 :)
      namespace {$xsi-prefix} {$xsi-uri},
      namespace {$soapenv-prefix} {$soapenv-uri},
      namespace {$svc-prefix} {$svc-uri},
      (: 构造SOAP Header空节点 :)
      element {$header-qname} {},
      (: 构造SOAP Body及业务内容 :)
      element {$body-qname} {
        element {$service-qname} {
          (: 遍历参数列表动态生成参数节点 :)
          for $param in $params/ROW_SET/ROW
          let $param-node-qname := fn:QName("", $param/Code/string())
          return element {$param-node-qname} {
            attribute {$xsi-type-attr} {$param/DataType/string()},
            $param/Value/string()
          }
        }
      }
    }
' passing
  'Service1' as "service",
  XMLType(cursor(with ns as
    (select 'SOAP' Service, 'xsi' Code, 'http://www.w3.org/2001/XMLSchema-instance' Value from dual
      union all
     select 'SOAP', 'soapenv', 'http://schemas.xmlsoap.org/soap/envelope/' from dual
      union all
     select 'Service1', 'my', 'my:uriservice1' from dual)
    select * from ns)) as "ns",
  XMLType(cursor(with params as
    (select 'Param1' Code, 'string' DataType, 'Value1' Value from dual
      union all
     select 'Param2', 'int', 'Value2' from dual)
    select * from params)) as "params"
)

说明

  • 上述代码运行后生成的XML报文和你给出的目标格式完全一致,命名空间声明、节点层级、xsi:type属性均符合SOAP协议规范
  • 所有逻辑完全动态:切换调用的Web服务时,仅需修改传入的service参数值、对应命名空间配置、参数列表即可,无需调整XQuery核心逻辑
  • 后续如果将传入的游标替换为ora:view读取数据表配置,只要保持返回字段结构和现有游标一致,XQuery部分无需任何修改
  • 示例中业务命名空间值为my:uriservice1,实际使用时替换为对应服务的真实命名空间URI即可

内容的提问来源于stack exchange,提问作者Ayb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 05:27:21