我在Nodejs中使用oracledb包在Oracle中运行存储过程,返回一个referance游标但是我得到错误PLS-00201 - 必须声明标识符'GETDATA',存储过程在我的Oracle上的包中定义数据库名为MYPACKAGE。到目前为止,我已经尝试在sql开发人员中将MYPACKAGE上的grant执行运行到usernameValue,但没有帮助。以下是我的代码:
我真的很感谢你的帮助!
var oracledb = require('oracledb');
var numRows = 2;
exports.test = function(req, res) {
oracledb.getConnection({
user: "usernameValue",
password: "passwordValue",
connectString: "ServerName/Service_Name"
}, function(err, connection) {
if (err) {
console.error("in connection error "+err.message);
return;
}
var bindvars = {
inSchemaOwner: 'MySchema',
cRefCur: { type: oracledb.CURSOR, dir : oracledb.BIND_OUT }
};
connection.execute(
"BEGIN GETDATA(:inSchemaOwner, :cRefCur); END;",
bindvars,
function(err, result)
{
if (err) {
console.error(err.message);
doRelease(connection);
return;
}
console.log(result.outBinds.cRefCur.metaData);
fetchRowsFromRS(connection, result.outBinds.cRefCur, numRows);
});
});
}
答案 0 :(得分:2)
如果存储过程GETDATA
在包MYPACKAGE
中,那么要调用它,您需要在存储过程前面加上包名:
"BEGIN MYPACKAGE.GETDATA(:inSchemaOwner, :cRefCur); END;",
否则,Oracle认为您正在尝试呼叫名为GETDATA
的{{3}}。 “独立”存储过程存在于包外。
此外,如果程序包MYPACKAGE
位于usernameValue
以外的模式中,则还需要在程序包名称前添加程序包名称,例如:
"BEGIN PACKAGEOWNER.MYPACKAGE.GETDATA(:inSchemaOwner, :cRefCur); END;",
最后,为了调用存储过程,需要在包规范中声明过程以及在包体中定义过程。