如何解决错误:DPI-1059:使用 node-oracledb 调用过程时,DDL 语句中不支持绑定变量
我在 sql-developer 中创建了下面的存储过程:
CREATE OR REPLACE PROCEDURE CREATE_USER(
t_username IN VARCHAR2,t_password IN VARCHAR2,t_default_table IN VARCHAR2,t_quota IN VARCHAR2
)
IS
m_statement VARCHAR2(1300);
m_username VARCHAR2(30) := t_username;
m_password VARCHAR2(30) := t_password;
m_default_table VARCHAR2(30) := t_default_table;
m_quota VARCHAR2(30) := t_quota;
BEGIN
m_statement := 'create user ' || t_username || ' identified by ' || t_password;
IF m_default_table != 'NULL' THEN
m_statement := m_statement || ' DEFAULT TABLESPACE ' || m_default_table;
END IF;
IF m_quota != '0' AND m_default_table != 'NULL' THEN
m_statement := m_statement || ' QUOTA ' || m_quota || 'M ON ' || m_default_table;
END IF;
EXECUTE IMMEDIATE (m_statement);
END;
这个编译没有错误。我也连接到oracle。然后我得到了这样的用户数据(req.body):
{ username: 'a',password: 'a',tablespace: 'NULL',quota: '0' }
但是当我执行“调用”过程查询时:
oracle.getConnection(
{
uuser : "AN",password: "AN123",connectString: "localhost:1521/orcl"
},(t_err,t_connection) => {
if(t_err){
console.error(t_err);
return;
}
t_connection.execute(
`BEGIN
createUser(:username,:password,:tablespace,:quota);
END;`,{
username: req.body.username,password: req.body.password,tablespace: req.body.tablespace,quota: req.body.quota,},(t_er,t_reslt) => {
if(t_er){
console.error(t_er);
return;
}
我收到了:
[Error: DPI-1059: bind variables are not supported in DDL statements] {
errorNum: 0,offset: 0
}
我尝试了很多方法来修复程序或 nodejs 代码,但没有奏效。我对这个话题很陌生。有谁能帮帮我吗?
解决方法
错误代码 DPI-1059
看起来很陌生,不像 Oracle 错误消息。我检查过 node-oracledb,他们使用 NJS-000
到 NJS-080
。谷歌搜索导致 Oracle 的 C 数据库编程接口,它在 dpiErrorMessages.h 中定义了此错误代码:
"DPI-1059: bind variables are not supported in DDL statements",// DPI_ERR_NO_BIND_VARS_IN_DDL
常量 DPI_ERR_NO_BIND_VARS_IN_DDL
在源代码中仅使用一次,在文件 dpiStmt.c 中:
// attempt to improve message "ORA-01036: illegal variable name/number"
if (status < 0) {
if (error->buffer->code == 1036) {
if (stmt->statementType == DPI_STMT_TYPE_CREATE ||
stmt->statementType == DPI_STMT_TYPE_DROP ||
stmt->statementType == DPI_STMT_TYPE_ALTER)
dpiError__set(error,error->buffer->action,DPI_ERR_NO_BIND_VARS_IN_DDL);
}
return DPI_FAILURE;
}
由于 Oracle 的错误信息非常混乱,值得研究一下 ORA-01036
,例如 here
您的代码对我来说运行没有错误 - 一旦我修复了 SQL 语句 CREATE_USER
中的名称与 JS 文件 createUser
中的名称之间的冲突。确实要确保您没有调用某些先前版本的 PL/SQL 包,这些包确实尝试在 CREATE USER 语句中使用绑定变量(这已在注释中注明)。如错误所述:Oracle DB 不支持此用法。例如,您不能这样做:
connection.execute(`create user :un identified by :pw`,['cj2','cj2password']);
- 这是一个 DDL 语句
- 它尝试使用绑定变量
这是不支持的。它因 DPI-1059 而失败。绑定变量用于数据,而不是语句的文本。
另外两个提示:
- 过滤或清理您的输入值以避免 SQL 注入攻击
- 使用异步/等待编程风格(而不是回调)可以省去一些麻烦。查看所有node-oracledb examples。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。