Javascript 如何读取Node.js查询的Oracle数据库XML列?
我需要读取将我的查询带到Oracle数据库的值,我使用Oracle DB和node.js。oracle DB在包含XML的列中返回这些值,但具有正常值的其他列返回okJavascript 如何读取Node.js查询的Oracle数据库XML列?,javascript,node.js,oracle,express,node-oracledb,Javascript,Node.js,Oracle,Express,Node Oracledb,我需要读取将我的查询带到Oracle数据库的值,我使用Oracle DB和node.js。oracle DB在包含XML的列中返回这些值,但具有正常值的其他列返回ok { "tramaenv": { "_readableState": { "objectMode": false, "highWaterMark": 16384, "buffer": {
{
"tramaenv": {
"_readableState": {
"objectMode": false,
"highWaterMark": 16384,
"buffer": {
"head": null,
"tail": null,
"length": 0
},
"length": 0,
"pipes": null,
"pipesCount": 0,
"flowing": null,
"ended": false,
"endEmitted": false,
"reading": false,
"sync": true,
"needReadable": false,
"emittedReadable": false,
"readableListening": false,
"resumeScheduled": false,
"emitClose": true,
"autoDestroy": false,
"destroyed": false,
"defaultEncoding": "utf8",
"awaitDrain": 0,
"readingMore": false,
"decoder": null,
"encoding": null
},
"readable": true,
"_events": {},
"_eventsCount": 1,
"_writableState": {
"corkedRequestsFree": {
"next": null,
"entry": null
}
},
"writable": true,
"allowHalfOpen": true,
"offset": 1
}
}
但真正的内容是这个XML
<soapenv:Envelope >
<soapenv:Header/>
<soapenv:Body>
<imp:obtNroConstanciaElectronica>
<reqObtNroConstanciaElectronica>
<idecotizacion>12668264</idecotizacion>
<ideprod>2003</ideprod>
</reqObtNroConstanciaElectronica>
</imp:obtNroConstanciaElectronica>
</soapenv:Body>
</soapenv:Envelope>
12668264
2003
如果您的示例数据是:
CREATE TABLE_name(id,xml)作为
选择1,'
12668264
2003
"来自双重,;
(注意:soapenv
和imp
的名称空间在XML中声明。)
然后可以使用SQL查询:
选择id,
十,*
来自表\u name t
交叉应用XMLTABLE(
XMLNAMESPACES(
'https://example.com/soapenv'作为“soapenv”,
'https://example.com/imp“作为“小鬼”
),
“/soapenv:Envelope/soapenv:Body/imp:obtnroConstanceElectronica/ReqobtnroConstanceElectronica”
传递XMLTYPE(t.xml)
柱
idecotizacion编号路径'/idecotizacion',
ideprod编号路径“./ideprod”
)x
输出为:
身份证件
思想协同
IDEPROD
1.
12668264
2003
节点oracledb文档具有一个 看起来您已经成功地获取了CLOB(这是避免XML长度被限制为maxium VARCHAR2长度所必需的),例如,您已经完成了如下操作:
const sql = `SELECT XMLTYPE.GETCLOBVAL(res) FROM resource_view`;
您可以选择,也可以告诉node oracledb。要执行后者,请将以下内容添加到脚本顶部:
oracledb.fetchAsString = [ oracledb.CLOB ];
您应该对这两种解决方案进行基准测试,并使用最好的解决方案。请在您的问题中添加一个与您正在使用的node.js代码相关的参数;XML中的名称空间(
soapenv
和imp
)是否有URI;所有基于C的Oracle API都限制了XML字符串的长度,因此几乎每个场景都需要一个to_clob()。@ChristopherJones这个答案的重点不是返回整个XML,而是在数据库中解析它并返回所需的字段。您可以通过输出看到返回值很短。谢谢,我使用了第一个选项,效果很好。