PLS-00201 - 必须声明标识符'Stored-Procedure-Name'

时间:2016-02-03 21:31:57

标签: function stored-procedures plsql

我在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);
      });
});  
}

1 个答案:

答案 0 :(得分:2)

如果存储过程GETDATA在包MYPACKAGE中,那么要调用它,您需要在存储过程前面加上包名:

      "BEGIN MYPACKAGE.GETDATA(:inSchemaOwner, :cRefCur); END;",

否则,Oracle认为您正在尝试呼叫名为GETDATA的{​​{3}}。 “独立”存储过程存在于包外。

此外,如果程序包MYPACKAGE位于usernameValue以外的模式中,则还需要在程序包名称前添加程序包名称,例如:

      "BEGIN PACKAGEOWNER.MYPACKAGE.GETDATA(:inSchemaOwner, :cRefCur); END;",

最后,为了调用存储过程,需要在包规范中声明过程以及在包体中定义过程。