如果您还没有注册自己的 xml 架构,最简单的方法是使用带变量的 xmlquery:
select
xmlquery(
'declare namespace soap = "http://schemas.xmlsoap.org/soap/envelope/";
<soap:Envelope>
<soap:Body>
<sendfund xmlns="http://blabla.com/">
<bank>
<code>{$bank_code}</code>
</bank>
<transaction>
<confirm>
<code>{$confirm_code}</code>
<message>{$confirm_message}</message>
</confirm>
<trtime>
<trdatetime>{$trtime_trdatetime} </trdatetime>
</trtime>
<sender>
<acc>{$sender_acc}</acc>
<name>{$sender_name}</name>
</sender>
<reciver>
<acc>{$reciver_acc}</acc>
<name>{$reciver_name}</name>
</reciver>
<amount>
<value>{$amount_value}</value>
</amount>
<dsignature>{$dsignature}</dsignature>
</transaction>
</sendfund>
</soap:Body>
</soap:Envelope>
'
passing
bank_code as "bank_code",
confirm_code as "confirm_code",
confirm_message as "confirm_message",
trtime_trdatetime as "trtime_trdatetime",
sender_acc as "sender_acc",
sender_name as "sender_name",
reciver_acc as "reciver_acc",
reciver_name as "reciver_name",
amount_value as "amount_value",
dsignature as "dsignature"
returning content
) as xdata
from
(
select
'0000' bank_code
,'0' confirm_code
,'success' confirm_message
,sysdate trtime_trdatetime
,'123456789' sender_acc
,'aaaaaa' sender_name
,'123456789' reciver_acc
,'aaaaaa' reciver_name
,150 amount_value
,'' dsignature
from dual
) t;
另一种更困难但更正确的生成此类文档的方法是使用特殊函数,如 xmlroot、xmlelement、xmlforest:
select
xmlroot(
xmlelement(
"soap:Envelope"
,XMLATTRIBUTES('http://blabla.com/' as "xmlns:soap")
,xmlelement(
"soap:Body"
,xmlelement(
"sendfunc"
,XMLATTRIBUTES('http://blabla.com/' as "xmlns")
,xmlforest(
xmlelement("code", bank_code) as "bank"
,xmlforest(
xmlforest(
confirm_code as "code",
confirm_message as "message"
) as "confirm"
,xmlforest(
trtime_trdatetime as "trdatetime"
) as "trtime"
,xmlforest(
sender_acc as "acc",
sender_name as "name"
) as "sender"
,xmlforest(
reciver_acc as "acc",
reciver_name as "name"
) as "reciver"
,xmlforest(
amount_value as "value"
) as "amount"
,dsignature as "dsignature"
) as "transaction"
)
)
)
)
, VERSION '1.0'
) xdata
from(
select
'0000' bank_code
,'0' confirm_code
,'success' confirm_message
,sysdate trtime_trdatetime
,'123456789' sender_acc
,'aaaaaa' sender_name
,'123456789' reciver_acc
,'aaaaaa' reciver_name
,150 amount_value
,'' dsignature
from dual
);
更新:如果您需要以精确的编码导出它,您需要使用 xmlserialize 函数,即只需将上面示例中的准备好的 xmltype 传递给 xmlserialize:
例如xml查询:
select
xmlserialize(document xdata as blob encoding 'UTF-8' version '1.0') x_serialized
from (
select
xmlquery(
'declare namespace soap = "http://schemas.xmlsoap.org/soap/envelope/";
<soap:Envelope>
<soap:Body>
<sendfund xmlns="http://blabla.com/">
<bank>
<code>{$bank_code}</code>
</bank>
<transaction>
<confirm>
<code>{$confirm_code}</code>
<message>{$confirm_message}</message>
</confirm>
<trtime>
<trdatetime>{$trtime_trdatetime} </trdatetime>
</trtime>
<sender>
<acc>{$sender_acc}</acc>
<name>{$sender_name}</name>
</sender>
<reciver>
<acc>{$reciver_acc}</acc>
<name>{$reciver_name}</name>
</reciver>
<amount>
<value>{$amount_value}</value>
</amount>
<dsignature>{$dsignature}</dsignature>
</transaction>
</sendfund>
</soap:Body>
</soap:Envelope>
'
passing
bank_code as "bank_code",
confirm_code as "confirm_code",
confirm_message as "confirm_message",
trtime_trdatetime as "trtime_trdatetime",
sender_acc as "sender_acc",
sender_name as "sender_name",
reciver_acc as "reciver_acc",
reciver_name as "reciver_name",
amount_value as "amount_value",
dsignature as "dsignature"
returning content
) as xdata
from
(
select
'0000' bank_code
,'0' confirm_code
,'success' confirm_message
,sysdate trtime_trdatetime
,'123456789' sender_acc
,'aaaaaa' sender_name
,'123456789' reciver_acc
,'aaaaaa' reciver_name
,150 amount_value
,'' dsignature
from dual
) t
);
XMLROOT/XMLELEMENT/XMLFOREST:
select
xmlserialize(document xdata as blob encoding 'UTF-8' version '1.0' indent size=2) x_serialized
from (
select
xmlroot(
xmlelement(
"soap:Envelope"
,XMLATTRIBUTES('http://blabla.com/' as "xmlns:soap")
,xmlelement(
"soap:Body"
,xmlelement(
"sendfunc"
,XMLATTRIBUTES('http://blabla.com/' as "xmlns")
,xmlforest(
xmlelement("code", bank_code) as "bank"
,xmlforest(
xmlforest(
confirm_code as "code",
confirm_message as "message"
) as "confirm"
,xmlforest(
trtime_trdatetime as "trdatetime"
) as "trtime"
,xmlforest(
sender_acc as "acc",
sender_name as "name"
) as "sender"
,xmlforest(
reciver_acc as "acc",
reciver_name as "name"
) as "reciver"
,xmlforest(
amount_value as "value"
) as "amount"
,dsignature as "dsignature"
) as "transaction"
)
)
)
)
, VERSION '1.0'
) xdata
from(
select
'0000' bank_code
,'0' confirm_code
,'success' confirm_message
,sysdate trtime_trdatetime
,'123456789' sender_acc
,'aaaaaa' sender_name
,'123456789' reciver_acc
,'aaaaaa' reciver_name
,150 amount_value
,'' dsignature
from dual
)
);