Javascript 如何读取Node.js查询的Oracle数据库XML列?

Javascript 如何读取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": {

我需要读取将我的查询带到Oracle数据库的值,我使用Oracle DB和node.js。oracle DB在包含XML的列中返回这些值,但具有正常值的其他列返回ok

{
  "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,而是在数据库中解析它并返回所需的字段。您可以通过输出看到返回值很短。谢谢,我使用了第一个选项,效果很好。