提问人:user18243519 提问时间:5/12/2023 更新时间:5/12/2023 访问量:220
SNOWFLAKE - 如何在程序中将变量与 DDL 绑定?
SNOWFLAKE - How to bind variables with DDL inside a procedure?
问:
我已经在带有“?”或“:1”占位符的 INSERT 或 SELECT 等语句中使用了绑定变量,但我不能将它与 CREATE ROLE 等指令一起使用,因为它会引发异常。
我需要绑定变量以创建一个过程,在其中我将创建一个具有给定名称的角色。我想避免 CONCAT t 或 ||出于 SQL 注入原因。
这有效
CREATE PROCEDURE TEST (name VARCHAR)
RETURNS VARCHAR NOT NULL
LANGUAGE SQL
AS
DECLARE
query VARCHAR;
BEGIN
query:= 'SELECT * from DUMMY name = ?';
EXECUTE IMMEDIATE :query USING (name);
RETURN 'OK';
END;
CALL TEST('OK');
但这会返回异常“语法错误行 1 在位置 12 意外”?“。调用过程时
CREATE PROCEDURE TEST2 (name VARCHAR)
RETURNS VARCHAR NOT NULL
LANGUAGE SQL
AS
DECLARE
query VARCHAR;
BEGIN
query:= 'CREATE ROLE ?';
EXECUTE IMMEDIATE :query USING (name);
RETURN 'OK';
END;
CALL TEST2('WRONG');
答:
0赞
NickW
5/12/2023
#1
当您引用对象名称时,您需要使用 IDENTIFIER 关键字,例如
query:= 'CREATE ROLE IDENTIFIER(?)';
评论