我正在 Node.js 上創建專案專案并使用 oracledb 模塊。我應該使用引數呼叫存盤程序,但是當我嘗試將數字引數傳遞給該程序時,出現此錯誤:
(節點:6952)未處理的PromiseRejectionWarning:錯誤:ORA-06502:PL/SQL:數字或值錯誤
這是程式:
create or replace procedure delete_song
(s_id in number, procedure_result out boolean) is
begin
delete from PLAYLIST_SONGS where SONG_ID = s_id;
delete from SONG where ID = s_id;
procedure_result:=true;
commit ;
exception when others
then
procedure_result:= false;
rollback;
end;
我在 Node.js 應用程式中執行程式的代碼:
router.delete("/:id", async (req, res) => {
const connection = await orcldb.getConnection(dbconf);
let in_id;
if (req.params.id === undefined) {
throw new Error("Bad request");
} else {
in_id = parseInt(req.params.id);
}
console.info("id: ", in_id, typeof in_id);
let procedureResult = await connection.execute(
`
BEGIN
DB_ADMIN.DELETE_SONG(:id, :ret);
END;`,
{
id: in_id,
ret: { dir: orcldb.BIND_OUT, type: orcldb.DB_TYPE_BOOLEAN },
}
);
let result = procedureResult.outBinds.ret;
if (!result) {
throw new Error("Delete song failed");
}
resultSet.close();
res.end("Success");
});
當我從 datagrip 呼叫這個程序時(例如)一切正常,腳本:
declare
result boolean;
begin
DB_ADMIN.DELETE_SONG(41, result);
end;
連接到資料庫并獲取資料正常作業。我的資料庫架構:
資料庫模式
db 用戶可以呼叫存盤程序。我正在使用 Oracle 12c。
我希望有人幫助我,我很抱歉我的英語不好。
uj5u.com熱心網友回復:
19c 對我來說似乎很好。是 IN 還是 OUT 系結的問題?我知道在為客戶端和服務器混合小端和大端時,BOOLEAN 系結存在一個問題。這已在 12.2 中修復。
const oracledb = require('oracledb');
const dbConfig = require('./dbconfig.js');
if (process.platform === 'darwin') {
oracledb.initOracleClient({libDir: process.env.HOME '/Downloads/instantclient_19_8'});
}
async function run() {
let connection;
try {
connection = await oracledb.getConnection(dbConfig);
await connection.execute(
`create or replace procedure delete_song
(s_id in number, procedure_result out boolean) is
begin
procedure_result:=true;
end;`);
let in_id = 1;
let procedureResult = await connection.execute(
`BEGIN DELETE_SONG(:id, :ret); END;`,
{ id: in_id,
ret: { dir: oracledb.BIND_OUT, type: oracledb.DB_TYPE_BOOLEAN },
});
let result = procedureResult.outBinds.ret;
console.log(result);
} catch (err) {
console.error(err);
} finally {
if (connection) {
try {
await connection.close();
} catch (err) {
console.error(err);
}
}
}
}
run();
輸出是:
$ node t.js
true
您的驗證應檢查是否parseInt()回傳NaN。如果你嘗試系結它,in_id你會得到DPI-1055: value is not a number (NaN) and cannot be used in Oracle numbers
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/374087.html
標籤:节点.js 甲骨文 表达 存储过程 节点oracledb
上一篇:我如何發送回應以做出反應?
