Snowflake SQL 存储过程并将查询中的值保存到变量

Snowflake SQL stored procedure and save value from query to variable

我正在用 Snowflake 编写 SQL 存储过程(语言 SQL 不是 Javascript)。我传入一个数据库名称,我有一个游标来获取该数据库的所有模式。我一个一个地遍历它们并创建一个新角色,然后做一些与授予权限相关的其他事情。如果该角色已经存在,我想跳过该模式并继续下一个模式。

我很难确定该角色是否存在。仅供参考,我正在做 CREATE ROLE IF NOT EXISTS name_of_schema...但是,如果该角色存在,我不想继续执行其余代码,因为某些代码将失败,例如授予未来的赠款。

据我所知,没有办法做 IF EXISTS ROLE name of role...

我可以查询 snowflake.account_usage.roles 视图,但这可能会延迟 2 小时,并且可以在更短的时间内创建角色,但如果这是我唯一的选择,我将不得不接受它。我想我可以使用 result_scan 函数...像这样,状态将包含“已经存在,语句成功。”

CREATE ROLE IF NOT EXISTS  <role name>;
query := 'SELECT status FROM table(result_scan(last_query_id()));';

但是,我不知道如何将 status 的值放入一个变量中,然后我可以在其中检查它是否是 LIKE '%already exists%'。

任何人都可以提供指导或给我一个例子吗?我想我可以把它放在一个游标中,然后循环来完成它。这似乎有很多代码来检索一个值。当只返回一行时,我似乎应该能够将查询中的值捕获到变量中。

在此先感谢您的帮助!

根据 this example,您可以在 SQL 过程中使用 Snowflake 脚本。

并且 Snowflake 脚本可以使用 conditionals

所以你会有这样的东西。我改用 table 创建,但它的想法完全相同:

create or replace procedure myprocedure()
  returns int
  language sql
  as
  $$
    DECLARE
        status string;
    BEGIN
        CREATE TABLE IF NOT EXISTS TEST(i int);
        status := (SELECT "status" FROM table(result_scan(last_query_id())));
        
        IF (status LIKE '%already exists%') THEN
            RETURN 1;
        ELSE
            RETURN 2;
        END IF;
    END;
$$;

旁注:经典网络界面需要 $$,但您可能不需要它们。