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;
$$;
旁注:经典网络界面需要 $$
,但您可能不需要它们。
我正在用 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;
$$;
旁注:经典网络界面需要 $$
,但您可能不需要它们。