Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
错误:DPI-1059:使用节点oracledb调用过程时,DDL语句中不支持绑定变量_Oracle_Ddl_Node Oracledb - Fatal编程技术网

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

错误:DPI-1059:使用节点oracledb调用过程时,DDL语句中不支持绑定变量,oracle,ddl,node-oracledb,Oracle,Ddl,Node Oracledb,我在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_usern

我在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的错误消息。我已经检查过了,他们使用的是
NJS-000
NJS-080
。谷歌搜索导致Oracle的C数据库编程接口,该接口在以下内容中定义了此错误代码:

DDL中的常量
DPI\u ERR\u NO\u BIND\u VARS\u仅在源代码中的文件中使用一次:

//尝试改进消息“ORA-01036:非法变量名称/编号”
如果(状态<0){
如果(错误->缓冲->代码==1036){
如果(stmt->statementType==DPI\u stmt\u TYPE\u CREATE||
stmt->statementType==DPI\u stmt\u TYPE\u DROP||
stmt->statementType==DPI\u stmt\u TYPE\u ALTER)
dpiError\uu集(错误,错误->缓冲区->操作,
DPI_ERR_NO_BIND_VARS_IN_DDL);
}
返回DPI_故障;
}

由于Oracle的错误消息非常混乱,因此值得研究
ORA-01036
,例如您的代码为我运行时不会出错-一旦我修复了SQL语句
CREATE\u USER
中的名称与JS文件
createUser
中的名称之间的冲突。确实要确保您没有调用PL/SQL包的某个早期版本,该版本确实试图在CREATEUSER语句中使用bind变量(这在注释中有所说明)。如错误所述:Oracle DB不支持此用法。例如,您不能执行以下操作:

connection.execute(`create user :un identified by :pw`, ['cj2', 'cj2password']);
  • 这是一个DDL语句
  • 它尝试使用绑定变量
这是不受支持的。而它在DPI-1059上失败了。绑定变量用于数据,而不是语句的文本

另外两个小贴士:

  • 过滤或清理输入值以避免SQL注入攻击
  • 使用异步/等待式编程(而不是回调)可以省去一些麻烦。看所有的照片

请查看文档的示例文件@wolφi。我已经看过了。我的所有参数都在参数中。所以我只是在Req.body.x中给它们赋值。根据你给我的链接,这是真的吗?有没有办法不使用dll语句?我对node oracledb完全不熟悉。您是对的,示例中说默认值为。但是,我很想指定数据类型和方向
用户名:{type:oracledb.STRING,dir:oracle\u db.BIND\u IN}
。此外,我会简化这个示例,例如首先创建一个带有硬编码名称的表,不带任何参数的过程,然后为表名添加一个参数,然后慢慢地向您的示例学习。请使用不同的变量名进行检查,可能其中一个是保留关键字。还有两种可能性:1)在PL/SQL中,它被称为CREATE_USER,调用代码使用createUser,但我认为这是一个输入错误。2) 在
quota:req.body.quota,
行中是否有额外的逗号?
// 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;
}
connection.execute(`create user :un identified by :pw`, ['cj2', 'cj2password']);