如何解决ORA-00900: 无效的 SQL 语句 - 当使用 node-oracledb 运行查询时
我以用户 AN 登录并在 sql developer 中创建了一个过程:
CREATE OR REPLACE PROCEDURE **viewSystemUsers**
AS
sysRefCursor SYS_REFCURSOR;
BEGIN
OPEN sysRefCursor
FOR
SELECT USERNAME,USER_ID,PASSWORD FROM dba_users;
dbms_sql.return_result(sysRefCursor);
END;
并且执行它,这正常工作。之后,我使用 node-oracledb 以同一用户的身份成功连接:
oracle.getConnection(
{
user : "AN",password: "AN123",connectString: "localhost:1521/orcl"
},(error,**connection**) => {
if(error){
console.error(error.message);
return;
}
else
console.log('connect sucessfully!');
但是当我设置 EXECUTE 查询时:
**connection**.execute(
`execute **viewSystemUsers**;`,(err,result) => {
if(err){
console.error(err);
return;
}
console.log(result);
我收到了 [错误:ORA-00900:无效的 SQL 语句] { errorNum: 900,offset: 0 }。 任何人都可以帮我修复它吗?非常感谢。
解决方法
-
您正在将字符串
execute ...
传递给数据库。但是execute
不是 SQL 关键字 - 它是 SQL*Plus 命令。所以数据库不理解它并给出错误。而是做begin viewSystemUsers() end;
。 -
为了便于编程,请使用 async/await,而不是回调
-
查看 node-oracledb 示例 impres.js,因为它显示了隐式结果的使用(这就是
dbms_sql.return_result()
的含义)。 -
查看 node-oracledb 示例 plsqlproc.js。
你的代码可能是这样的:
const oracledb = require('oracledb');
const dbConfig = require('./dbconfig.js');
if (process.platform === 'darwin') {
oracledb.initOracleClient({libDir: process.env.HOME + '/Downloads/instantclient_19_8'});
}
let sql,binds,options,result;
sql = `begin viewSystemUsers(); end;`;
binds = [];
options = { outFormat: oracledb.OUT_FORMAT_OBJECT };
async function run() {
let connection;
try {
connection = await oracledb.getConnection(dbConfig);
result = await connection.execute(sql,options);
console.dir(result,{ depth: null });
} catch (err) {
console.error(err);
} finally {
if (connection) {
try {
await connection.close();
} catch (err) {
console.error(err);
}
}
}
}
run();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。