错误:DPI-1059:使用节点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代码,但都不起作用。我对这个话题很陌生。有人能帮我吗?

一旦我修复了SQL语句CREATE_USER中的名称和JS文件createUser中的名称之间的冲突,您的代码运行起来就不会出错。确实要确保您没有调用某些PL/SQL包的早期版本,该版本确实试图在CREATE USER语句中使用绑定变量(这在注释中有说明(。正如错误所述:Oracle数据库不支持这种用法。例如,不能执行:

connection.execute(`create user :un identified by :pw`, ['cj2', 'cj2password']);
  • 这是一个DDL语句
  • 它尝试使用绑定变量

这是不受支持的。DPI-1059失败了。绑定变量用于数据,而不是语句的文本。

另外两个提示:

  • 过滤或净化输入值以避免SQL注入攻击
  • 使用async/await风格的编程(而不是回调(可以省去一些麻烦。请参阅所有节点oracledb示例

错误代码DPI-1059看起来不熟悉,不像Oracle错误消息。我已经检查了节点oracledb,它们使用NJS-000NJS-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,例如这里的

最新更新