雪花云数据平台是否可以在存储过程中设置变量,以便视图使用它?



我有一个依赖于会话变量的视图:

create or replace view test as 
(
select getvariable('MY_VAR')::int as col1
) ;

我可以像这样查询该视图:

set MY_VAR=5;
select * from test; -- 5
set MY_VAR=6;
select * from test; -- 6

现在我想从存储过程执行相同的查询:

create or replace procedure myproc()
returns VARCHAR
language javascript
as 
$$
var stmt = snowflake.createStatement({sqlText: "select * from test"});
var rs = stmt.execute();
rs.next(); // .next().getColumnValue(1);
return rs.getColumnValue(1);
$$
;
call myproc() -- this work as long as MY_VAR is set outside before the call proc

问题是我想从过程中设置会话变量,这是不允许的

存储过程执行错误:不支持的语句类型"SET"。在雪花执行

最终目标是拥有一个运行存储过程的 Snowflake TASK,我需要能够以某种方式设置变量(TASK 也不允许运行 set,存储过程也不允许(。

有什么解决方法吗?

无法在存储过程中设置会话变量的原因是,默认情况下,执行模式设置为EXECUTE AS OWNER,出于安全考虑,这是一种限制性更强的模式。

有关详细信息,请参阅此雪花文档页面。

因此,仅当将存储过程的执行模式设置为"作为调用方执行"时,才能在存储过程中 SET (和使用( 会话变量。下面是存储过程的修订版本,演示了会话变量的使用(使用任意值 7(:

CREATE OR REPLACE PROCEDURE MYPROC()
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
EXECUTE AS CALLER
AS $$
snowflake.execute({"sqlText": "SET MY_VAR = 7"});
var stmt = snowflake.createStatement({"sqlText": "select * from test"});
var rs = stmt.execute();
rs.next(); // .next().getColumnValue(1);
return rs.getColumnValue(1);
$$
;

最新更新