存储过程概述¶
您可以编写存储过程,以使用执行代码来扩展系统。通过过程,您可以使用分支、循环和其他编程构造。您可以从其他代码调用过程,对其多次重用。
借助存储过程,您可以执行以下操作:
自动执行需要频繁执行多个数据库操作的任务。
动态创建和执行数据库操作。
使用存储过程所有者角色的权限执行代码,而不是使用运行存储过程的角色的权限。
这样,存储过程所有者就可以将执行指定操作的权力下放给用户,否则用户就无法执行指定操作。不过,这些存储过程的所有者权限也存在限制。
例如,假设您希望通过删除早于指定日期的数据来清理数据库。您可以在代码中多次执行删除操作,每次从特定表中删除数据。您可以将所有这些语句放在单个存储过程中,然后传递指定截止日期的参数。
部署过程后,您可以调用过程以清理数据库。随着数据库的变化,您可以更新存储过程以清理其他表;如果有多个用户使用新清理命令,他们可以调用一个存储过程,而不必记住每个表名称并逐个清理每个表。
存储过程与 UDF 类似,但两者存在重要区别。有关更多信息,请参阅 选择是编写存储过程还是用户定义函数。
过程只是扩展 Snowflake 的一种方式。对于其他内容,请参阅以下内容:
支持的语言和工具¶
您可以使用多种工具中的任何一种(具体取决于您喜欢的工作方式),创建和管理存储过程(以及其他 Snowflake 实体)。
语言 |
方法 |
支持 |
---|---|---|
SQL 使用 Java、JavaScript、Python、Scala 或 SQL Scripting 处理程序 |
在 Snowflake 中编写 SQL 代码,以创建和管理 Snowflake 实体。使用支持的处理程序语言之一编写过程的逻辑。 |
|
Java、Python 或 Scala |
在客户端,为推送到 Snowflake 以进行处理的操作编写代码。 |
|
命令行界面 |
使用命令行创建和管理 Snowflake 实体,将属性指定为 JSON 对象的属性。 |
|
Python |
在客户端,编写在 Snowflake 上执行管理操作的代码。 |
|
REST |
请求 RESTful 端点以创建和管理 Snowflake 实体。 |
您可以使用 受支持的语言 之一编写过程的逻辑(其处理程序)。拥有处理程序后,就可以使用 CREATE PROCEDURE 命令 创建过程,然后使用 CALL 语句 调用存储过程。
存储过程可以返回单个值或(在处理程序语言支持的情况下)表格数据。有关受支持返回类型的更多信息,请参阅 CREATE PROCEDURE。
选择语言时,还要考虑支持的处理程序位置。并非所有语言都支持在暂存区上引用处理程序(处理程序代码必须是内联的)。有关更多信息,请参阅 将处理程序代码保持内联或保留在暂存区。
语言 |
处理程序位置 |
---|---|
Java |
内联或暂存 |
JavaScript |
内联 |
Python |
内联或暂存 |
Scala |
内联或暂存 |
Snowflake Scripting |
内联 |
备注
要创建和调用匿名过程,请使用 CALL(使用匿名过程)。创建和调用匿名过程不需要具有 CREATE PROCEDURE 架构权限的角色。
存储过程示例¶
以下示例中的代码创建了一个名为 myproc
的存储过程和一个名为 run
的 Python 处理程序。
CREATE OR REPLACE PROCEDURE myproc(from_table STRING, to_table STRING, count INT)
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = '3.9'
PACKAGES = ('snowflake-snowpark-python')
HANDLER = 'run'
as
$$
def run(session, from_table, to_table, count):
session.table(from_table).limit(count).write.save_as_table(to_table)
return "SUCCESS"
$$;
以下示例中的代码调用存储过程 myproc
。
CALL myproc('table_a', 'table_b', 5);
准则和约束¶
- 技巧:
有关编写存储过程的技巧,请参阅 使用存储过程。
- Snowflake 约束:
您可以通过在 Snowflake 约束内进行开发来确保 Snowflake 环境的稳定性。有关更多信息,请参阅 设计保持在 Snowflake 施加的约束范围内的处理程序。
- 命名:
请确保在命名过程时避免与其他过程发生冲突。有关更多信息,请参阅 命名和重载过程和 UDFs。
- 实参:
指定存储过程的实参,并指示哪些实参是可选的。有关更多信息,请参阅 定义 UDFs 和存储过程的实参。
- 数据类型映射:
每种处理程序语言的数据类型与用于实参和返回值的 SQL 类型之间都有一套单独的映射。有关每种语言的映射的更多信息,请参阅 SQL 与处理程序语言之间的数据类型映射。
处理程序写入¶
- 处理程序语言:
有关编写处理程序的特定于语言的内容,请参阅 支持的语言和工具。
- 外部网络访问:
您可以使用 外部网络访问 访问外部网络位置。您可以创建对 Snowflake 外部的特定网络位置的安全访问,然后从处理程序代码中使用该访问。
- 日志记录和跟踪:
您可以通过 获取日志消息和跟踪事件 来记录代码活动,将数据存储在以后可以查询的数据库中。
安全¶
无论选择使用调用方权限还是所有者权限运行存储过程,都会影响存储过程有权访问的信息以及可以允许其执行的任务。有关更多信息,请参阅 了解调用方权限和所有者权限存储过程。
存储过程与用户定义函数 (UDFs) 存在某些共同的安全问题。有关更多信息,请参阅以下内容:
您可以通过遵循 UDFs 和过程的安全实践 中所述的最佳实践,帮助存储过程的处理程序代码安全地执行
确保对不应访问敏感信息的用户隐藏敏感信息。有关更多信息,请参阅 使用安全 UDFs 和存储过程保护敏感信息
处理程序代码部署¶
在创建存储过程时,可以将实现存储过程逻辑的处理程序指定为与 CREATE PROCEDURE 语句内联的代码,也可以指定为语句外部的代码,例如打包并复制到阶段的编译代码。
有关更多信息,请参阅 将处理程序代码保持内联或保留在暂存区。