错误:DPI-1059:使用 node-oracledb 调用过程时,DDL 语句中不支持绑定变量

如何解决错误: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-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,例如 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 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-