错误: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 代码,但没有奏效。我对这个话题很陌生。任何人都可以帮助我吗?

克里斯托弗·琼斯

你的代码对我来说运行没有错误——一旦我修复了 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 注入攻击
  • 使用 async/await 编程风格(而不是回调)可以省去一些麻烦。查看所有node-oracledb 示例

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在块语句中使用jooq调用过程

libclntsh.so.12.1:运行node-oracledb示例时无法打开共享库文件错误

Node Mailer错误:“不支持的配置,在本地主机中将Nodemailer降级到v0.7.1以使用它”

错误:使用Jack时,不支持缩小用于测试的变量

Tensorflow错误:不支持可调用

Autoprefixer不支持Node v0.10.37错误

我在mysql中调用过程时出错:错误代码:1222。使用的SELECT语句具有不同的列数

执行存储过程NJS-012时,node-oracledb错误

调用node-oracledb的createPool方法

使用oracledb在Node中进行大量SQL查询

Recordset.Find错误:行集不支持使用存储过程向后滚动

使用oracledb进行查询时,Node中出现“ npm ERR!errno 3221225477”错误

获取错误绑定参数0-使用构造函数创建对象时可能不支持的类型

尝试使用node-oracledb在Oracle数据库中将图像插入BLOB类型时出错

在静态json文件的Node js上使用getJSON时不支持获取协议

调用过程时错误的数量或类型的参数错误

我在mysql中调用过程时发生#1054错误

使用SID和node-oracledb连接OracleDB失败

在 Oracle OleDB 中使用 UNION ALL SQL 语句时出现“不支持的类型”警告

使用 node.js oracledb 连接到 Oracle DB

执行存储过程时出现 node-oracledb 错误

浏览器中的 Node-oracledb 错误“尚未为上下文加载模块名称”

与 Node.js 的 Oracle DB 连接出现“错误:架构用户名未设置!尝试设置环境变量 NODE_ORACLEDB_USER。”

关闭与 Oracle DB 和 Node.js 的 node-oracledb 池连接时出错

错误:DDL/DML 语句不支持写入首选项和分区字段

使用 node/fastify 出现错误不支持的媒体类型:application/x-www-form-urlencoded

如何在 node-oracledb 5.1 中执行存储过程时出现编译错误

在后端使用 node-oracledb 管理来自前端的请求

REST API 插入无法使用 node-oracledb