存储过程 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 PL/SQL 在查询 3 列信息时出现存储过程错误