Я бы не советовал искать теги XML с INSTR
, так как он чувствителен к пространству, например, он не найдет <idBiller>111</idBiller >
или <idBiller a="x">111</idBiller>
. В конце концов, это XML, который якобы легко разобрать. (Впрочем, никто не упоминал об этом синтаксисе).
Во-вторых, BLOB
- это совершенно неправильный тип данных. Это для двоичных данных. Просто подождите, пока первый клиент по имени Agüero или Jørgensen. Подходящий тип данных для XML в Oracle: XMLTYPE
:
CREATE TABLE admintxnunauthdata (
accountno NUMBER,
msg XMLTYPE
) XMLTYPE COLUMN msg STORE AS SECUREFILE BINARY XML (COMPRESS HIGH);
INSERT INTO admintxnunauthdata (accountno, msg) VALUES (1,
'<PayBillerRequestDTO><idCustomer>00000024</idCustomer><idBiller>VODA</idBiller><billerName>ojas yadnik </billerName><billReferenceNumber>111</billReferenceNumber></PayBillerRequestDTO>');
INSERT INTO admintxnunauthdata (accountno, msg) VALUES (2,
'<PayBillerRequestDTO><idCustomer>00000025</idCustomer><idBiller>JODA</idBiller><billerName>ojas yadnik </billerName><billReferenceNumber>222</billReferenceNumber></PayBillerRequestDTO>');
Затем вы можете искать записи по idBiller:
SELECT *
FROM admintxnunauthdata
WHERE XMLExists('/PayBillerRequestDTO[idBiller="VODA"]' PASSING msg);
и извлечение значений тегов из XML:
SELECT accountno,
XMLQuery('/PayBillerRequestDTO/billReferenceNumber/text()'
PASSING msg RETURNING CONTENT)
FROM admintxnunauthdata
WHERE XMLExists('/PayBillerRequestDTO[idBiller="VODA"]' PASSING msg);
Чтобы преобразовать текст XML в обычный тип данных, используйте
SELECT accountno,
XMLCast(XMLQuery('/PayBillerRequestDTO/billReferenceNumber/text()'
PASSING msg RETURNING CONTENT) AS NUMBER) AS billreferencenumber
FROM admintxnunauthdata
WHERE XMLExists('/PayBillerRequestDTO[idBiller="VODA"]' PASSING msg);
ACCOUNTNO BILLREFERENCENUMBER
1 111
Если вы не можете изменить (или позволить изменить) структуру таблицы, вы можете теоретически преобразовать BLOB-объект в XMLTYPE на лету, но я понятия не имею о влиянии на производительность:
SELECT accountno,
XMLCast(XMLQuery('/PayBillerRequestDTO/billReferenceNumber/text()'
PASSING msg RETURNING CONTENT) AS NUMBER) AS billreferencenumber
FROM (
SELECT accountno, XMLTYPE(msg,1) as msg
FROM admintxnunauthdata
)
WHERE XMLExists('/PayBillerRequestDTO[idBiller="VODA"]' PASSING msg);
Для преобразования из BLOB
в XMLTYPE
, см. преобразование Oracle Blob в тип XML