Snowflake 中的存储过程

2025 年 7 月 29 日 | 阅读 10 分钟

存储过程概述

要添加在系统中运行 SQL 的过程代码,您可以编写存储过程。可以使用编程结构在存储过程中执行循环和分支。一个存储过程可以创建一次,然后重复使用。其中一种支持的语言用于编写过程的处理程序,即逻辑。

在获得处理程序后,您可以使用 `BUILD PROCEDURE` 命令来构建过程,并使用 `CALL` 语句来调用它。

您可以从存储过程返回单个值或表格式数据(如果由处理程序语言支持)。有关支持的返回类型的更多详细信息,请参阅 CREATE PROCEDURE。

注意:使用 CALL(带有匿名过程)来创建和调用匿名过程。创建和调用匿名方法不需要具有 CREATE PROCEDURE 架构权限的角色。

Stored Procedures in Snowflake

注意:虽然存储过程和 UDF 相似,但它们并不相同。有关更多详细信息,请参阅决定是编写用户定义函数还是存储过程。

什么是存储过程?

您可以为存储过程定义逻辑,并从 SQL 调用它。在大多数情况下,存储过程的逻辑使用 SQL 语句来执行数据库操作。存储过程允许您额外执行

  • 动态生成和运行 SQL 语句。
  • 使用拥有该过程的角色特权来执行代码,而不是使用运行该过程的角色特权。
  • 这使得存储过程的所有者能够授予那些原本无法执行特定任务的用户执行这些任务的能力。
  • 然而,这些所有者权限的存储技术受到一些限制。

安全性

存储过程对数据的访问以及可能的操作范围可能会受到其是在调用者的权限下还是在所有者的权限下执行的影响。有关更多详细信息,请参阅存储过程理解调用者权限和所有者权限。一些安全问题在用户定义函数(UDF)和存储过程之间是相似的。有关更多详细信息,请参阅

  • 遵循安全标准中概述的建议标准,可以帮助确保过程的处理程序代码安全运行。
  • 确保不应访问敏感信息的人员无法看到它。
  • 有关更多详细信息,请参阅使用安全 UDF 和存储过程保护敏感数据。
Stored Procedures in Snowflake

处理程序代码发布

在构建过程时,您可以在 CREATE PROCEDURE 语句内指定运行的代码,也可以在语句外指定运行的代码,例如已生成、打包并复制到暂存区中的代码。

Snowflake 存储过程遵循哪些协议?

可以从 SQL 直接调用的逻辑集合称为 Snowflake 存储过程。其主要用途是运行多个 SQL 语句以执行数据库任务。通过存储过程,用户可以使用调用者的角色权限(而不是所有者的角色权限)来运行和动态生成 SQL。这种权限转移使得更安全和更受控的操作成为可能。

Snowflake 存储过程通常用于自动化繁琐的操作,例如通过删除超过一定年龄的条目来清理数据。过程非常适合任何需要协调多个 SQL 语句之间步骤的过程。存储过程对变量、控制流和错误处理的强大支持使得在 Snowflake 中存储复杂的数据库逻辑成为可能。

支持 Snowflake 存储过程编程的语言

Snowflake 支持多种编程语言来创建其存储过程的逻辑。这些语言包括:

  • 使用 Java 中的 Snowpark API
  • 使用 Python 中的 Snowpark API
  • 使用 Scala 中的 Snowpark API
  • 用于 Snowflake 脚本的 SQL
  • JavaScript

注意:您选择的语言主要取决于您对它的熟悉程度、当前代码库以及它可能提供的任何独特功能或库。

Snowflake 存储过程的语法分解为以下部分:

名称: 指示 Snowflake 存储过程的名称。除非用双引号括起来,否则名称应以字母字符开头,并避免使用空格或其他字符。

输入参数 [,...]): 存储过程可以接受一个或多个参数作为输入参数,也可以不接受任何参数。定义了存储过程将生成的返回值的类型。

语言 SQL: 此字段指示用于存储过程的语言,因为 Snowflake 支持多种语言。对于 Snowflake JavaScript,值为 `javascript`;也可以是 Scala、Python、Java 或 Snowflake Scripting (SQL)。

过程体如下: Snowflake 存储过程的逻辑在过程体中定义。过程体流可以包括变量声明、SQL 语句等。

Snowflake 存储过程的结构

通过使用 Snowflake 的高级存储过程,开发人员可以将多个 SQL 查询合并为一个可调用的例程。这提高了 SQL 操作 的效率,并鼓励代码重用。现在让我们更详细地检查 Snowflake 存储过程的结构。

Snowflake 存储过程的命名约定

建议坚持一致且描述性的命名风格,尽管 Snowflake 不强制执行严格的限制,以保持清晰并便于将来的维护和方法调用。

在 Snowflake 存储过程中声明返回类型

在创建过程时,必须指定 Snowflake 存储过程将返回的值的类型。在此过程中,选择的数据类型用于 RETURNS 关键字之后。

Stored Procedures in Snowflake

返回类型确保过程生成所需的输出,该输出随后可以被进一步应用或处理。STRING、NUMBER、FLOAT BOOLEAN 等是常见的返回类型。

以下是 Snowflake 存储过程的典型 JavaScript 返回类型的列表,包括示例:

  1. Snowflake 存储过程的返回类型 - STRING
    Snowflake 存储过程可以返回文本值或字符串。
  2. Snowflake 存储过程的返回类型 - FLOAT
    如果您正在处理数值,并希望它们保持数值,请使用 FLOAT 数据类型。
  3. Snowflake 存储过程的返回类型 - BOOLEAN
    对于评估条件并返回 TRUE 或 FALSE 的过程,可以使用布尔返回类型。
  4. Snowflake 存储过程的返回类型:VARIANT、对象和数组
    Snowflake 还支持 VARIANT、OBJECT 和 ARRAY 等更复杂的数据类型。在处理半结构化数据或需要返回多个值时,这些非常有用。

Snowflake 存储过程中的调用者和所有者权限

Snowflake 存储过程可以与所有者或调用者权限同时执行,但不能同时拥有两者。

调用者权限: 因为 Snowflake 存储过程以与调用它的个人或角色相同的权限运行,所以它可以访问调用者或调用者当前会话的信息。例如,它可以读取调用者的会话变量并在查询中使用它们。

Stored Procedures in Snowflake

选择调用者或所有者权限

在使用所有者或调用者权限之前,必须满足以下条件:

所有者权限: 选择此选项可将工作分配给其他用户或角色,从而授予他们所有者权限。当您希望他们拥有受限访问权限而无需授予更多权限时,此功能非常有用。

调用者权限: 如果您希望 Snowflake 存储过程仅在调用者拥有或拥有必要访问权限的对象上运行,请选择此选项。当过程需要使用调用者的环境时,例如会话变量。

Snowflake 存储过程的限制

  • 每个 CALL 语句只能调用一个存储过程。
  • 来自存储过程的调用不能与单个语句中的其他调用分组,也不能包含在表达式中。
  • 虽然您不能将存储过程调用用作 SQL 查询的一部分,但您可以在存储过程内部调用另一个存储过程,甚至递归调用该过程。

注意:嵌套调用或递归调用可能导致超出最大堆栈深度。为了避免潜在的堆栈溢出错误,嵌套调用或使用递归时必须谨慎。

如何使用 Snowflake Scripting 创建 Snowflake 存储过程

  • 对每个组件的解释
  • Snowflake 存储过程中的 Snowflake 变量

如果 Snowflake 存储过程变量有意义,该怎么办?

具有存储特定数据类型的值的能力的命名对象是 Snowflake 变量。在执行存储过程时,存储在变量中的值可能会发生变化。在 Snowflake 存储过程中,变量用于存储可以在过程内部重复引用的结果。

与普通编程语言相比,Snowflake 脚本(SQL)中的变量不需要在使用前声明。尽管如此,在 Snowflake 存储过程的开头声明所有变量被认为是最佳实践。声明变量可以提高可读性,并有助于防止任何未来的问题。关于 Snowflake 存储过程中的变量的关键细节:

注意:如果您可以使用 DEFAULT 关键字设置初始值,Snowflake 将自动检测变量的数据类型。

1. Snowflake 存储过程中的游标声明

在 Snowflake 存储过程中,游标充当允许数据库记录导航的控制结构。将其视为结果行组内单个行的指针。就像编程语言中的迭代器一样,它允许您遍历查询结果集中的行集,并一次处理一行。

在 Snowflake 存储过程中使用游标

以下描述了如何在 Snowflake 存储过程中使用游标:

  • 声明: 游标在使用前需要声明。为此,您必须为游标命名并将其链接到 SELECT 语句。
  • 打开: 声明游标后,必须使用 OPEN 命令打开游标。这是一个关键步骤,因为它会在执行相应查询之前打开游标。
  • 获取: 声明游标后,FETCH 命令允许您从游标中获取行。每次 FETCH 操作都会从结果集中检索一行。
  • 关闭: 一旦所有行都被提取,就应该使用 CLOSE 命令关闭游标以释放资源。

2. 在 Snowflake 存储过程中包含循环

循环编程的基本原则是根据预定义的重复次数或条件重复执行一组指令。Snowflake 存储过程支持多种循环结构,每种结构都有独特的属性和应用。

Snowflake Scripting 支持的循环类型如下:

  • 考虑 Snowflake 存储过程循环
  • Snowflake 存储过程中的 WHILE 循环
  • Snowflake 存储过程中的 REPEAT 循环
  • Snowflake 存储过程中的 LOOP

3. Snowflake 存储过程中的 RESULTSETs

在 Snowflake 存储过程中,用户可以使用 RESULTSET 数据类型存储和操作 SELECT 语句的结果集。

此强大功能为您如何处理查询结果提供了灵活性,允许您使用游标遍历它们或将它们作为表返回。

RESULTSET 代表什么?

在 Snowflake 中,RESULTSET 是查询结果集的指针。与仅存储一个值的标准变量相比,RESULTSET 可以保留多行数据。因此,需要处理或返回多行数据的过程将发现它非常有用。

如何在 Snowflake JavaScript 中编写 Snowflake 存储过程

对于了解 JavaScript 的开发人员来说,Snowflake 作为存储过程语言的支持开启了一个全新的可能性世界。本节将指导您完成使用 Snowflake JavaScript 创建 Snowflake 存储过程的过程,确保您充分理解每一步。

注意:虽然 Snowflake JavaScript 支持提供了更大的灵活性和功能,但它在存储过程中本质上仍在使用 SQL。

必需条件

  • 拥有所需权限的 Snowflake 账户。
  • 对 Snowflake JavaScript 和 SQL 的基本理解。

认识 Snowflake 存储过程

在开始创建过程之前,理解 Snowflake 存储过程的结构至关重要。Snowflake 中的存储过程

  • 能够接受输入参数。
  • 能够返回单个值。
  • 包含一系列逻辑和 SQL 语句。
  • 可以从 SQL 查询调用它。

开发 Snowflake 存储过程的最佳方法

  • 模块化: 将复杂的进程分解为更易于管理、可重用的部分。
  • 错误处理: 始终使用错误处理来处理异常并发送信息性错误消息。
  • 注释: 如果您的代码涉及复杂的过程,请随意用注释来描述它们。
  • 优化: 避免在循环内部进行大量操作。而是利用 Snowflake 的基于集合的操作。
  • 安全性: 为确保过程执行调用者的权限并防止未经授权的访问,请使用 EXECUTE AS CALLER 子句。

SQL 存储过程和 JavaScript 之间的主要区别

  • JavaScript 过程: JavaScript 过程在管理复杂逻辑、纠错和控制流方面提供了适应性。
  • SQL 过程: 最适合那些更熟悉 SQL 并用于简单 SQL 任务的人。

与 Snowflake 存储过程相关的要点

  • 从最基本的解释到 Snowflake 存储过程中最复杂的功能和元素
  • 在 Snowflake 中调用这些存储例程的实用性。
  • 如何使用 Snowflake Scripting (SQL) 开发 Snowflake 存储过程
  • 如何使用 JavaScript 创建 Snowflake 存储过程

结论

Snowflake 存储过程是一种实用的解决方案,可让用户轻松地集成执行 SQL 的过程代码。这些过程不仅仅是一系列 SQL 语句;它们提供了一个动态环境,其中的编程结构支持分支和循环。它们真正的力量在于其可重用性;一旦创建了一个过程,就可以一次又一次地调用它,从而确保每次都能进行可靠高效的操作。


下一主题