存储过程 SQL 编译错误中的执行错误:Statement.execute 中的标识符“TEST3”无效

Posted

技术标签:

【中文标题】存储过程 SQL 编译错误中的执行错误:Statement.execute 中的标识符“TEST3”无效【英文标题】:Execution error in store procedure SQL compilation error: invalid identifier 'TEST3' At Statement.execute 【发布时间】:2020-11-18 11:16:19 【问题描述】:

我在下面创建了存储过程,但是在 where 子句中解析 VAL 时出错,我也尝试了双引号 " 和 backstick `

create or replace TABLE T1 (
    COL VARCHAR(16777216)
);

insert into t1 values  ('test1');
insert into t1 values  ('test2');
insert into t1 values  ('test3');

create or replace procedure ifcopied(val varchar)
                                   returns varchar
                                   language javascript
                                   execute as caller
                                   as
                                   $$
                                   sql_command = "select * from t1 where col = " + VAL;
                                   var stmt = snowflake.createStatement(sqlText:sql_command);                       
                                   var res = stmt.execute();
                                   res.next();
                                   row_status = res.getColumnValue(1);
                                   return row_status                                   
                                   $$;

call ifcopied('test3')

;

遇到错误

Execution error in store procedure IFCOPIED: SQL compilation error: error line 1 at position 29 invalid identifier 'TEST3' At Statement.execute, line 4 position 50

存储过程 IFCOPIED 中的执行错误:SQL 编译错误:错误第 1 行在位置 29 无效标识符“TEST3”在 Statement.execute 第 4 行位置 50

【问题讨论】:

【参考方案1】:

除了 Gokhan 所拥有的之外,您还可以通过这种方式执行它。

sql_command = `select * from t1 where col = '$VAL';`

这可以减少您对串联的使用,并允许您查看行中的变量。

【讨论】:

【参考方案2】:

需要加单引号或者使用绑定变量:

create or replace procedure ifcopied(val varchar)
                                   returns varchar
                                   language javascript
                                   execute as caller
                                   as
                                   $$
                                   sql_command = "select * from t1 where col = '" + VAL + "'";
                                   var stmt = snowflake.createStatement(sqlText:sql_command);                       
                                   var res = stmt.execute();
                                   res.next();
                                   row_status = res.getColumnValue(1);
                                   return row_status                                   
                                   $$;

推荐使用绑定变量的版本:

create or replace procedure ifcopied(val varchar)
                                   returns varchar
                                   language javascript
                                   execute as caller
                                   as
                                   $$
                                   sql_command = "select * from t1 where col = ?";
                                   var stmt = snowflake.createStatement(sqlText:sql_command, binds:[ VAL ]);                       
                                   var res = stmt.execute();
                                   res.next();
                                   row_status = res.getColumnValue(1);
                                   return row_status                                   
                                   $$;

【讨论】:

以上是关于存储过程 SQL 编译错误中的执行错误:Statement.execute 中的标识符“TEST3”无效的主要内容,如果未能解决你的问题,请参考以下文章

oracle存储过程报937错误

ORACLE PL/SQL 在查询 3 列信息时出现存储过程错误

Netezza 存储过程错误

sql developer存储过程运行无误

在SQL Server2005中,下面调用存储过程的语句错误的是:

重命名 SQL Server 中的存储过程