【问题标题】:PLS-00306 when calling Oracle stored procedure in Node.js在 Node.js 中调用 Oracle 存储过程时的 PLS-00306
【发布时间】:2020-12-26 01:24:26
【问题描述】:

如何解决“ ORA-06550:第 1 行,第 7 列:PLS-00306:调用 'GET_TICKER_INFO' ORA-06550:第 1 行,第 7 列:PL/SQL:语句被忽略” ?

嗨,我是 node 和 Oracle 的新手。 无法使用节点 js 运行该过程。需要帮助来解决这个问题 Oracle过程参考

PROCEDURE get_data_info (
  p_ticker       VARCHAR2,
  p_acronym      VARCHAR2,
  p_sort         VARCHAR2,
  p_call_source  VARCHAR2,
  p_data     OUT REF_CRS);

节点js代码

sql = 'begin get_data_info(:p_ticker,:p_acronym,:p_sort,:p_call_source,:p_data); end;';
        // run procedure to get all data
        const ticker_data ={
          p_ticker: '',
          p_acronym: '',
          p_sort: '',
          p_call_source: '',
          p_data: ''
        };
        data = { p_ticker: 'AAPL', p_data: ':output'};
        binds  = Object.assign({}, ticker_data, data);
        
        options = {
            outFormat: oracledb.OUT_FORMAT_OBJECT,  
        };
        result = await connection.execute(sql, binds, options);

【问题讨论】:

  • p_data OUT REF_CRS ,什么是 REF_CRS ?是你的类型吗??

标签: node.js oracle plsql node-oracledb


【解决方案1】:

猜测REF_CRS是一个REF CURSOR,你的问题是绑定参数对象中p_data的定义。你需要给它一个类型和方向,比如:

p_data: {dir: oracledb.BIND_OUT, type: oracledb.CURSOR}

查看 node-oracledb 文档章节REF CURSOR Bind Parameters

工作代码如下:

/*

create or replace PROCEDURE get_data_info (
  p_ticker       VARCHAR2,
  p_acronym      VARCHAR2,
  p_sort         VARCHAR2,
  p_call_source  VARCHAR2,
  p_data     OUT SYS_REFCURSOR) as
begin
  open p_data for select * from dual;
end;
/
show errors

*/

const oracledb = require('oracledb');
const dbConfig = { user: 'cj', password: 'cj', connectString: 'localhost/orclpdb1' };

if (process.platform === 'darwin') {
  oracledb.initOracleClient({libDir: '/Users/cjones/instantclient_19_3'});
}

let sql, binds, options, result;
sql = `SELECT TO_CHAR(CURRENT_DATE, 'DD-Mon-YYYY HH24:MI') AS D FROM DUAL`;
options = {
//  outFormat: oracledb.OUT_FORMAT_OBJECT  // uncomment if you want object output instead of array
};

async function run() {
  let connection;
  
  try {
    connection = await oracledb.getConnection(dbConfig);
    
    sql = 'begin get_data_info(:p_ticker,:p_acronym,:p_sort,:p_call_source,:p_data); end;';
    
    const ticker_data = {
      p_ticker: '',
      p_acronym: '',
      p_sort: '',
      p_call_source: '',
      p_data: ''
    };
    const data = { p_ticker: 'AAPL', p_data: {dir: oracledb.BIND_OUT, type: oracledb.CURSOR}};
    const binds  = Object.assign({}, ticker_data, data);   

    result = await connection.execute(sql, binds, options);

    const resultSet = result.outBinds.p_data;
    let row;
    while ((row = await resultSet.getRow())) {
      console.log(row);
    }
    await resultSet.close();   // always close the ResultSet
    
  } catch (err) {
    console.error(err);
  } finally {
    if (connection) {
      try {
    await connection.close();
      } catch (err) {
    console.error(err);
      }
    }
  }
}

run();

【讨论】:

  • 感谢您的帮助。它正在工作,但在结果集中,缺少属性名称。我们如何解决这个问题。
  • 如果您的意思是列名和类型信息,请查看metadata
  • 如果你的意思是你想要对象而不是数组,请检查我更新答案的options 变量。
猜你喜欢
  • 1970-01-01
  • 2013-04-01
  • 2012-08-25
  • 2011-03-02
  • 1970-01-01
  • 2011-08-10
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多