存储过程概述

您可以编写存储过程,以使用执行代码来扩展系统。通过过程,您可以使用分支、循环和其他编程构造。您可以从其他代码调用过程,对其多次重用。

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

  • 自动执行需要频繁执行多个数据库操作的任务。

  • 动态创建和执行数据库操作。

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

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

例如,假设您希望通过删除早于指定日期的数据来清理数据库。您可以在代码中多次执行删除操作,每次从特定表中删除数据。您可以将所有这些语句放在单个存储过程中,然后传递指定截止日期的参数。

部署过程后,您可以调用过程以清理数据库。随着数据库的变化,您可以更新存储过程以清理其他表;如果有多个用户使用新清理命令,他们可以调用一个存储过程,而不必记住每个表名称并逐个清理每个表。

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

过程只是扩展 Snowflake 的一种方式。对于其他内容,请参阅以下内容:

支持的语言和工具

您可以使用多种工具中的任何一种(具体取决于您喜欢的工作方式),创建和管理存储过程(以及其他 Snowflake 实体)。

语言

方法

支持

SQL

使用 Java、JavaScript、Python、Scala 或 SQL Scripting 处理程序

在 Snowflake 中编写 SQL 代码,以创建和管理 Snowflake 实体。使用支持的处理程序语言之一编写过程的逻辑。

Java

JavaScript

Python

Scala

SQL Scripting

Java、Python 或 Scala

Snowpark API

在客户端,为推送到 Snowflake 以进行处理的操作编写代码。

Java

Python

Scala

命令行界面

Snowflake CLI

使用命令行创建和管理 Snowflake 实体,将属性指定为 JSON 对象的属性。

管理 Snowflake 对象

Python

Snowflake Python API

在客户端,编写在 Snowflake 上执行管理操作的代码。

管理存储过程

REST

Snowflake REST API

请求 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"
$$;
Copy

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

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

准则和约束

技巧:

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

Snowflake 约束:

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

命名:

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

实参:

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

数据类型映射:

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

处理程序写入

处理程序语言:

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

外部网络访问:

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

日志记录和跟踪:

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

安全

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

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

处理程序代码部署

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

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

语言: 中文