如何解决在Node.js中调用Oracle存储过程时为PLS-00306
如何解决“ 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);
Node 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);
解决方法
假设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,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();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。