存储过程概述

您可以编写存储过程,以使用执行 SQL 的过程代码来扩展系统。在存储过程中,可以使用程序化结构来执行分支和循环。创建存储过程后,便可以多次重复使用。

您可以使用 受支持的语言 之一编写过程的逻辑(其处理程序)。拥有处理程序后,就可以使用 CREATE PROCEDURE 命令 创建过程,然后使用 CALL 语句 调用存储过程

存储过程可以返回单个值或(在处理程序语言支持的情况下)表格数据。有关受支持返回类型的更多信息,请参阅 CREATE PROCEDURE

备注

要创建和调用匿名过程,请使用 CALL(使用匿名过程)。创建和调用匿名过程不需要具有 CREATE PROCEDURE 架构权限的角色。

备注

存储过程与 UDF 类似,但两者存在重要区别。有关更多信息,请参阅 选择是编写存储过程还是用户定义函数

本主题内容:

什么是存储过程?

存储过程包含您编写的逻辑,因此您可以通过 SQL 进行调用。存储过程的逻辑通常通过执行 SQL 语句来执行数据库操作。

借助存储过程,您还可以执行以下操作:

  • 动态创建和执行 SQL 语句。

  • 使用存储过程所有者角色的权限执行代码,而不是使用运行存储过程的角色的权限。

    这样,存储过程所有者就可以将执行指定操作的权力下放给用户,否则用户就无法执行指定操作。不过,这些存储过程的所有者权限也存在限制。

您可能需要使用存储过程来自动执行需要一项需要多条 SQL 语句且频繁执行的任务。例如,假设您希望通过删除早于指定日期的数据来清理数据库。您可以编写多条 DELETE 语句,每条语句都会删除特定表中的数据。您可以将所有这些语句放在单个存储过程中,并传递指定截止日期的参数。然后,只需调用该存储过程即可清理数据库。随着数据库的变化,您可以更新存储过程以清理其他表;如果有多个用户使用清理命令,他们可以调用一个存储过程,而不必记住每个表名称并逐个清理每个表。

存储过程示例

以下示例中的代码创建了一个名为 myproc 的存储过程和一个名为 run 的 Python 处理程序。

create or replace procedure myproc(from_table string, to_table string, count int)
  returns string
  language python
  runtime_version = '3.8'
  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"
$$;
Copy

以下示例中的代码调用存储过程 myproc

CALL myproc('table_a', 'table_b', 5);
Copy

支持的语言

您可以用几种编程语言中的任何一种编写过程的处理程序(其逻辑)。每种语言都允许您在语言及其运行时环境的约束范围内操作数据。无论使用哪种处理程序语言,创建存储过程本身的方法都是一样的,都是使用 SQL,指定处理程序和处理程序语言。

您可以使用以下任一语言编写处理程序:

语言

开发者指南

Java(使用 Snowpark API)

使用 Java 编写存储过程

JavaScript

使用 JavaScript 写入存储过程

Python(使用 Snowpark API)

使用 Python 编写存储过程

Scala(使用 Snowpark API)

使用 Scala 编写存储过程

Snowflake Scripting (SQL)

使用 Snowflake Scripting 编写存储过程

语言选择

您可以用几种编程语言中的任何一种编写过程的处理程序(其逻辑)。每种语言都允许您在语言及其运行时环境的约束范围内操作数据。

在以下情况下,您可能会选择某种特定的语言:

  • 您已经有该语言的代码。

    例如,如果您已经有一个可以用作处理程序的 Java 方法,并且该方法的对象位于 .jar 文件中,则可以将.jar 复制到暂存区,将处理程序指定为类和方法,然后将语言指定为 Java。

  • 该语言具有其他语言所不具备的功能。

  • 该语言具有可以帮助您执行所需处理的库。

选择语言时,还要考虑支持的处理程序位置。并非所有语言都支持在暂存区上引用处理程序(处理程序代码必须是内联的)。有关更多信息,请参阅 将处理程序代码保持内联或保留在暂存区

语言

处理程序位置

Java

内联或暂存

JavaScript

内联

Python

内联或暂存

Scala

内联或暂存

Snowflake Scripting

内联

开发者指南

准则和约束

技巧:

有关编写存储过程的技巧,请参阅 使用存储过程

Snowflake 约束:

您可以通过在 Snowflake 约束内进行开发来确保 Snowflake 环境的稳定性。有关更多信息,请参阅 设计保持在 Snowflake 施加的约束范围内的处理程序

命名:

请确保在命名过程时避免与其他过程发生冲突。有关更多信息,请参阅 命名和重载过程和 UDFs

实参:

指定存储过程的实参,并指示哪些实参是可选的。有关更多信息,请参阅 定义 UDFs 和存储过程的实参

数据类型映射:

每种处理程序语言的数据类型与用于实参和返回值的 SQL 类型之间都有一套单独的映射。有关每种语言的映射的更多信息,请参阅 SQL 与处理程序语言之间的数据类型映射

处理程序写入

处理程序语言:

有关编写处理程序的特定于语言的内容,请参阅 支持的语言

外部网络访问:

您可以使用 外部网络访问 访问外部网络位置。您可以创建对 Snowflake 外部的特定网络位置的安全访问,然后从处理程序代码中使用该访问。

日志记录和跟踪:

您可以通过 获取日志消息和跟踪事件 来记录代码活动,将数据存储在以后可以查询的数据库中。

安全

无论选择使用调用方权限还是所有者权限运行存储过程,都会影响存储过程有权访问的信息以及可以允许其执行的任务。有关更多信息,请参阅 了解调用方权限和所有者权限存储过程

存储过程与用户定义函数 (UDFs) 存在某些共同的安全问题。有关更多信息,请参阅以下内容:

处理程序代码部署

在创建存储过程时,可以将实现存储过程逻辑的处理程序指定为与 CREATE PROCEDURE 语句内联的代码,也可以指定为语句外部的代码,例如打包并复制到阶段的编译代码。

有关更多信息,请参阅 将处理程序代码保持内联或保留在暂存区

创建并调用过程

可以使用 SQL 来创建和调用过程。

  • 编写处理程序代码后,就可以通过执行 CREATE PROCEDURE 语句创建存储过程,并指定存储过程的处理程序。有关更多信息,请参阅 创建存储过程

  • 要调用过程,请执行指定该存储过程的 SQL CALL 语句。有关更多信息,请参阅 调用存储过程

  • 要创建只执行一次并被丢弃的临时过程,请使用 WITH...CALL。有关更多信息,请参阅 CALL(使用匿名过程)

语言: 中文