从 XML 中提取数据(CLOB 类型)
Extract data from XML (CLOB Type)
我需要从 table FND_SOA_BODY_PIECE
和列 BODY(数据类型:CLOB)中提取 BATCH_ID
的数据,其中包含 XML 数据
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<tns1:InputParameters xmlns:tns1="http://xmlns.oracle.com/apps/gl/soaprovider/plsql/geas_gl_journal_pkg/geas_get_gl_data/">
<tns1:P_BATCH_TBL>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85380</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85345</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85364</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85356</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85374</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85358</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
</tns1:P_BATCH_TBL>
</tns1:InputParameters>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
我在下面尝试了这个,但它只给了我空值
SELECT xmltype(fsa.body).EXTRACT('/Envelope/Body/InputParameters/P_BATCH_TBL/P_BATCH_TBL_ITEM/BATCH_ID').getStringVal() FROM fnd_soa_body_piece;
有人可以帮忙吗?
首先,请 post 有效 XML,因为您显示的内容看起来像是浏览器的屏幕截图,并且缺少结束标记和无效字符。如果您的 xml 有命名空间引用,那么您需要将它们包含在 XPath 中并作为 extract() 函数的参数。这是一个例子:
with fnd_soa_body_piece as (
select xmltype(
'<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header>
<SOAP-ENV:Body>
<tns1:InputParameters xmlns:tns1="http://xmlns.oracle.com/apps/gl/soaprovider/plsql/geas_gl_journal_pkg/geas_get_gl_data/">
<tns1:P_BATCH_TBL>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85380</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85345</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85364</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85356</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85374</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85358</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
</tns1:P_BATCH_TBL>
</tns1:InputParameters>
</SOAP-ENV:Body>
</SOAP-ENV:Header>
</SOAP-ENV:Envelope>') body from dual
)
select extract(body,'/SOAP-ENV:Envelope/SOAP-ENV:Header/SOAP-ENV:Body/tns1:InputParameters/tns1:P_BATCH_TBL/tns1:P_BATCH_TBL_ITEM/tns1:BATCH_ID',
' xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:tns1="http://xmlns.oracle.com/apps/gl/soaprovider/plsql/geas_gl_journal_pkg/geas_get_gl_data/"').getStringVal()
from fnd_soa_body_piece
更新:
把return的结果作为一个SQL的行集,需要用到XMLTABLE函数,如:
with fnd_soa_body_piece as (
select xmltype(
'<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header>
<SOAP-ENV:Body>
<tns1:InputParameters xmlns:tns1="http://xmlns.oracle.com/apps/gl/soaprovider/plsql/geas_gl_journal_pkg/geas_get_gl_data/">
<tns1:P_BATCH_TBL>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85380</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85345</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85364</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85356</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85374</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85358</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
</tns1:P_BATCH_TBL>
</tns1:InputParameters>
</SOAP-ENV:Body>
</SOAP-ENV:Header>
</SOAP-ENV:Envelope>') body from dual
)
select t.batch_id
from fnd_soa_body_piece,
xmltable( xmlnamespaces(
'http://schemas.xmlsoap.org/soap/encoding/' as "SOAP-ENC",
'http://schemas.xmlsoap.org/soap/envelope/' as "SOAP-ENV",
'http://xmlns.oracle.com/apps/gl/soaprovider/plsql/geas_gl_journal_pkg/geas_get_gl_data/' as "tns1" ),
'/SOAP-ENV:Envelope/SOAP-ENV:Header/SOAP-ENV:Body/tns1:InputParameters/tns1:P_BATCH_TBL/tns1:P_BATCH_TBL_ITEM/tns1:BATCH_ID'
passing fnd_soa_body_piece.body columns batch_id number(10) PATH 'text()') t
我需要从 table FND_SOA_BODY_PIECE
和列 BODY(数据类型:CLOB)中提取 BATCH_ID
的数据,其中包含 XML 数据
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<tns1:InputParameters xmlns:tns1="http://xmlns.oracle.com/apps/gl/soaprovider/plsql/geas_gl_journal_pkg/geas_get_gl_data/">
<tns1:P_BATCH_TBL>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85380</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85345</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85364</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85356</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85374</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85358</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
</tns1:P_BATCH_TBL>
</tns1:InputParameters>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
我在下面尝试了这个,但它只给了我空值
SELECT xmltype(fsa.body).EXTRACT('/Envelope/Body/InputParameters/P_BATCH_TBL/P_BATCH_TBL_ITEM/BATCH_ID').getStringVal() FROM fnd_soa_body_piece;
有人可以帮忙吗?
首先,请 post 有效 XML,因为您显示的内容看起来像是浏览器的屏幕截图,并且缺少结束标记和无效字符。如果您的 xml 有命名空间引用,那么您需要将它们包含在 XPath 中并作为 extract() 函数的参数。这是一个例子:
with fnd_soa_body_piece as (
select xmltype(
'<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header>
<SOAP-ENV:Body>
<tns1:InputParameters xmlns:tns1="http://xmlns.oracle.com/apps/gl/soaprovider/plsql/geas_gl_journal_pkg/geas_get_gl_data/">
<tns1:P_BATCH_TBL>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85380</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85345</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85364</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85356</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85374</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85358</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
</tns1:P_BATCH_TBL>
</tns1:InputParameters>
</SOAP-ENV:Body>
</SOAP-ENV:Header>
</SOAP-ENV:Envelope>') body from dual
)
select extract(body,'/SOAP-ENV:Envelope/SOAP-ENV:Header/SOAP-ENV:Body/tns1:InputParameters/tns1:P_BATCH_TBL/tns1:P_BATCH_TBL_ITEM/tns1:BATCH_ID',
' xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:tns1="http://xmlns.oracle.com/apps/gl/soaprovider/plsql/geas_gl_journal_pkg/geas_get_gl_data/"').getStringVal()
from fnd_soa_body_piece
更新:
把return的结果作为一个SQL的行集,需要用到XMLTABLE函数,如:
with fnd_soa_body_piece as (
select xmltype(
'<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header>
<SOAP-ENV:Body>
<tns1:InputParameters xmlns:tns1="http://xmlns.oracle.com/apps/gl/soaprovider/plsql/geas_gl_journal_pkg/geas_get_gl_data/">
<tns1:P_BATCH_TBL>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85380</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85345</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85364</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85356</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85374</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
<tns1:P_BATCH_TBL_ITEM>
<tns1:BATCH_ID>85358</tns1:BATCH_ID>
</tns1:P_BATCH_TBL_ITEM>
</tns1:P_BATCH_TBL>
</tns1:InputParameters>
</SOAP-ENV:Body>
</SOAP-ENV:Header>
</SOAP-ENV:Envelope>') body from dual
)
select t.batch_id
from fnd_soa_body_piece,
xmltable( xmlnamespaces(
'http://schemas.xmlsoap.org/soap/encoding/' as "SOAP-ENC",
'http://schemas.xmlsoap.org/soap/envelope/' as "SOAP-ENV",
'http://xmlns.oracle.com/apps/gl/soaprovider/plsql/geas_gl_journal_pkg/geas_get_gl_data/' as "tns1" ),
'/SOAP-ENV:Envelope/SOAP-ENV:Header/SOAP-ENV:Body/tns1:InputParameters/tns1:P_BATCH_TBL/tns1:P_BATCH_TBL_ITEM/tns1:BATCH_ID'
passing fnd_soa_body_piece.body columns batch_id number(10) PATH 'text()') t