如何在Node.js的oracledb(5.5.0)中按列名访问查询结果字段?
问题:OracleDB(5.5.0)查询结果能否按列名访问?
我正在使用oracledb(5.5.0)。执行SELECT语句时,目前只能通过列索引访问查询结果,但想知道是否可以按列名访问。我的代码如下:
const oracledb = require('oracledb'); ... //do a simple select statement select = async(query, params) => { console.log("Selecting (5468468466)... "); let conn; try{ conn = await this.getDatabaseConnectionOracle(); const result = await conn.execute(query, params); console.log("result: "); console.log(result); let rows = result.rows; rows.forEach( (row) => { console.log(`Lowercase: ${row.fullname} `); console.log(`Uppercase: ${row.FULLNAME} `); console.log(`row[0]: ${row[0]} `); }); return result.rows; } catch (error) { console.error('Error in oracle.select(): ' , error); } finally { if (conn) { await conn.close(); } } }
输出结果:
Selecting (5468468466)... result: { metaData: [ { name: 'USERID' }, { name: 'FULLNAME' } ], rows: [ [ '123456789', 'My Full Name' ] ] } Lowercase: undefined Uppercase: undefined row[0]: 123456789
解决方案
可以按列名访问查询结果,默认情况下oracledb返回数组形式的行数据,只需配置outFormat参数,让结果以对象形式返回,就能通过列名(对应metaData里的name字段)访问。
有两种配置方式:
1. 单次查询配置
在conn.execute方法中添加第三个参数,指定outFormat为oracledb.OUT_FORMAT_OBJECT:
const result = await conn.execute(query, params, { outFormat: oracledb.OUT_FORMAT_OBJECT });
修改后,result.rows里的每一行会变成对象:
{ USERID: '123456789', FULLNAME: 'My Full Name' }
此时就能通过row.FULLNAME或row.USERID访问对应列的值。
2. 全局/连接级配置
如果希望所有查询默认返回对象形式,可在初始化时全局配置,或在获取连接后单独设置:
// 全局配置(初始化阶段设置) oracledb.outFormat = oracledb.OUT_FORMAT_OBJECT; // 或针对当前连接设置 conn.outFormat = oracledb.OUT_FORMAT_OBJECT;
注意:Oracle默认会将未加双引号的列名转为大写,所以返回的对象属性名是大写形式(比如FULLNAME),这也是你之前用row.fullname得到undefined的原因。如果需要小写属性名,可在查询时给列名加别名:
SELECT USERID AS userid, FULLNAME AS fullname FROM your_table
这样返回的对象属性就是userid和fullname,可直接用row.userid访问。
内容的提问来源于stack exchange,提问作者NL3294
相关产品推荐
相关产品推荐

