Snowflake - 系统/内置存储过程

Posted

技术标签:

【中文标题】Snowflake - 系统/内置存储过程【英文标题】:Snowflake - system/built-in stored procedures 【发布时间】:2021-05-07 21:02:01 【问题描述】:

Snowflake 是否提供任何存储过程?

SHOW PROCEDURES IN ACCOUNT;

SELECT * FROM TABLE(RESULT_SCAN(LAST_QUERY_ID())) WHERE "is_builtin" != 'N';
-- 0 rows

SHOW FUNCTIONS IN ACCOUNT;

SELECT * FROM TABLE(RESULT_SCAN(LAST_QUERY_ID())) WHERE "is_builtin" != 'N';
--  571

我们有相当广泛的函数列表,但我找不到单个存储过程。

一些函数(例如SYSTEM$CANCEL_ALL_QUERIES)包含副作用,这意味着它们可以是存储过程(它们甚至支持通过CALL执行):

SELECT SYSTEM$CANCEL_ALL_QUERIES(CURRENT_SESSION()::INT);
CALL SYSTEM$CANCEL_ALL_QUERIES(CURRENT_SESSION()::INT);

这种方法背后有什么理由吗?

【问题讨论】:

【参考方案1】:

Snowflake 在过去 6 年中一直是一个不断发展的产品。当它首次发布时,不支持动态 SQL aka 过程,并且很少支持数据库自省,就像您在 PostgreSQL 的系统表中一样。

如此多的“做 X”或“告诉我 Y”是通过相当丑陋的函数调用完成的,这清楚地向您展示了逃离沙坑的地方(与 PostgreSQL 相比,数据库健康/状态也是“表” )。我记得我们的团队编写代码支持从 SHOW 命令读取结果,因为 RESULT_SCAN 不存在。

所以平台发生了很大变化,现在使用“功能”的心智模型,“程序”改变思维方式,似乎适合模型的事情。

【讨论】:

这更有意义。普通的 UDF 函数不会有副作用,SF 可以,是的,函数一次用于代替不存在的过程。

以上是关于Snowflake - 系统/内置存储过程的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 Snowflake 存储过程中的会话参数

使用 Snowflake 中的任务调用存储过程

在 Snowflake 中处理多个 SQL 语句的存储过程

在 SnowFlake DB 中并行执行存储过程中的 SQL 语句

在存储过程中创建 Snowflake 仓库会更改当前仓库

Snowflake /当存储过程作为OWNER执行时如何获取原始调用者