我有以下查询,搜索匹配字符串的xml列请求。
$("#btnSave5").click(function (e) {
e.preventDefault();
var form = $(this).closest("form");
$.ajax({
type: "POST",
url: form.attr("Edit"),
data: form.serialize(),
success: function (response) {
alert("Informations are successfully changed");
window.location.href = "/InspekcijskeKontrole/Index";
},
error: function (error) {
alert(error);
}
});
});
但是我收到select * from Customer
where access like '%USR'
and status = 'SUCCESS'
and request like '%' ||
(SELECT REGEXP_SUBSTR(request, '<paes:IdName>PurchaseId</paes:IdName><paes:IdValue>\d+</paes:IdValue>')
FROM Customer
where request like '%Add%SUB%PRIME%') || '%';
我想要的是搜索与添加具有相同ID的请求,但它不是添加请求。例如....取消订单请求,其中包含用于取消订单的ID号。
如何更改上述使用请求,以便ORA-01427: single-row subquery returns more than one row
like
'%'|| ...... || '%'
或上述查询的替代方案?
in
将返回多行ID
我想要的是搜索匹配ID的所有请求列。如果我将SELECT REGEXP_SUBSTR(request, '<paes:IdName>PurchaseId</paes:IdName><paes:IdValue>\d+</paes:IdValue>')
FROM Customer
where request like '%Add%SUB%PRIME%'
替换为like
,我会收到in
错误。我该如何解决这个问题?
编辑: 示例请求列
ORA-00932: inconsistent datatypes: expected - got CLOB
如果我双击HUGECLOB,我会得到完整的请求,如下所示......
Request
(HUGECLOB)
(HUGECLOB)
(HUGECLOB)
...
以下是取消请求的示例
<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header>
<wsse:Security
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
SOAP-ENV:mustUnderstand="1">
<wsse:UsernameToken
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
wsu:Id="uuid_86c8ee4f-b6e6-4e07-9fa6-e2f9f2695c01">
<wsse:Username>admin</wsse:Username>
<wsse:Password
Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">mx9483</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
....
<paes:IdName>PurchaseId</paes:IdName>
<paes:IdValue>2786872</paes:IdValue>
....
<paes:IdName>MailAddressId</paes:IdName>
<paes:IdValue>2786622</paes:IdValue>
....
</SOAP-ENV:Body>
答案 0 :(得分:0)
因为sopa消息是正常的xml文档。它可以通过更加结构化的方式处理。
准备测试数据库;
create table rr (id number, requext clob) ;
短信息版本。
insert into rr values(1, '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body xmlns:paes="emvin.atl/schema/v1">
<paes:IdName>PurchaseId</paes:IdName>
<paes:IdValue>2786872</paes:IdValue>
<paes:IdName>MailAddressId</paes:IdName>
<paes:IdValue>2786622</paes:IdValue>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>');
insert into rr values(2, '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body xmlns:paes="emvin.atl/schema/v1">
<paes:IdName>CancelId</paes:IdName>
<paes:IdValue>2786872</paes:IdValue>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>');
使用xmltable函数,我们可以提取paes:IdValue。
select * from rr,xmltable( xmlnamespaces('emvin.atl/schema/v1' as "paes"), '$doc//paes:IdValue' passing xmltype(rr.requext) as "doc"
columns IdValue number path './text()'
) ;
现在,您可以从之前的查询创建视图,或者只在with语句中使用它。
with test as (
select * from rr,xmltable( xmlnamespaces('emvin.atl/schema/v1' as "paes"), '$doc//paes:IdValue' passing xmltype(rr.requext) as "doc"
columns IdValue number path './text()'
))
select * from test where IdValue in (select IdValue from test where id =1)
and id != 1;