创建存储过程

您可以使用 Snowflake 提供的几种方法中的任意一种来创建 存储过程。本主题将介绍这些方法。

创建过程

  1. 使用几种受支持的语言(包括 Python、Java 和 Scala)之一,将过程逻辑编写为处理程序。

  2. 选择一个工具或 API,使用您编写的处理程序创建过程。

    有关各项的更多信息,请参阅 用于创建过程的工具

    SQL

    使用 SQL 以及使用几种语言中的一种编写逻辑。

    Snowpark

    为 Java、Python 或 Scala 使用 Snowpark API。

    命令行

    执行 Snowflake CLI 命令以创建过程。

    Python API

    执行客户端 Python 命令以创建过程。

    REST

    向 RESTful API 发出请求以创建过程。

  3. 根据您的需要,使用几种工具中的一种 执行过程

用于创建过程的工具

您可以使用 Snowflake 提供的几种方法中的任意一种来创建 过程,具体取决于您可用的语言和技能集。从下表中选择适合您需求的工具。

语言

方法

SQL

执行 SQL 命令,例如使用 Snowsight。

执行 SQL CREATE PROCEDURE 命令,使用以下一种语言编写的处理程序代码创建过程:

Java、Python 或 Scala

使用受支持的语言之一编写代码,然后在本地执行代码,以在 Snowflake 中执行操作。

使用以下列语言之一执行使用 Snowpark APIs 的客户端代码。

命令行

通过从命令行执行命令来创建和管理 Snowflake 实体。

执行 Snowflake CLI 的命令。

Python

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

执行使用 Snowflake Python API 的代码。

**RESTful APIs**(与语言无关)

请求 RESTful 端点以创建和管理 Snowflake 实体。

发出请求以使用 Snowflake REST API 创建过程。

关键属性

下面介绍创建过程时需要或通常使用的一些属性。

过程名称:

过程名称不需要与处理程序的名称匹配。有关名称约束和约定的更多信息,请参阅 命名和重载过程和 UDFs

实参:

有关要求的更多信息,请参阅 定义 UDFs 和存储过程的实参

返回类型:

有关 Snowflake 如何将 SQL 数据类型映射到处理程序数据类型的信息,请参阅 SQL 与处理程序语言之间的数据类型映射

处理程序名称:

需要此属性时,它是类或方法的名称,该类或方法包含了调用过程时执行的代码。只需要为用 Java、Python 和 Scala 编写的处理程序指定处理程序名称。对于 JavaScript 和 Snowflake Scripting 处理程序,以内联方式指定的所有代码都将作为处理程序执行。

依赖关系:

对于使用 Java、Python 或 Scala 编写的处理程序,您可能还需要指定 Snowpark 库,例如在创建过程时。

有关使依赖项可供处理程序使用的更多信息,请参阅 为代码提供依赖项

处理程序语言运行时:

当处理程序语言是 Java、Python 或 Scala 时,指定运行时版本以指明要使用哪个受支持的运行时版本。请记住,如果您使用默认版本,该默认版本将随时间而改变。

访问控制要求

用于执行此操作的 角色 必须至少具有以下 权限

权限

对象

备注

CREATE PROCEDURE

架构

USAGE

过程

将新建过程的 USAGE 权限授予某个角色可允许拥有该角色的用户在 Snowflake 中的其他位置调用该过程。

USAGE

外部访问集成

对创建过程时指定的集成(如果有)来说是必需的。有关更多信息,请参阅 CREATE EXTERNAL ACCESS INTEGRATION

READ

密钥

对创建过程时指定的密钥(如果有)来说是必需的。有关更多信息,请参阅 创建表示凭据的密钥在函数或过程中使用外部访问集成

USAGE

架构

对创建过程时指定的包含密钥的架构(如果有)来说是必需的。有关更多信息,请参阅 创建表示凭据的密钥在函数或过程中使用外部访问集成

要对架构中的任何对象执行操作,需要对父数据库和架构的 USAGE 权限。

有关创建具有指定权限集的自定义角色的说明,请参阅 创建自定义角色

有关对 安全对象 执行 SQL 操作的相应角色和权限授予的一般信息,请参阅 访问控制概述

使用说明

所有处理程序语言

  • 存储过程支持 重载。如果两个过程具有不同数量的参数或不同的参数数据类型,则它们可以具有相同的名称。

  • 存储过程不是原子的;如果存储过程中的一条语句失败,则存储过程中的其他语句不一定会回滚。有关存储过程和事务的信息,请参阅 事务管理

  • 关于元数据:

    注意

    客户应确保在使用 Snowflake 服务时,不会将个人数据(用户对象除外)、敏感数据、出口管制数据或其他受监管数据作为元数据输入。有关更多信息,请参阅 Snowflake 中的元数据字段

小技巧

如果组织混合使用调用方权限和所有者权限存储过程,则可能需要对存储过程使用命名约定,以指示单个存储过程是调用方权限存储过程还是所有者权限存储过程。

Java

请参阅 已知限制

Javascript

JavaScript 存储过程只能返回单个值,例如字符串(例如,成功/失败指示符)或数字(例如,错误代码)。如果您需要返回更广泛的信息,则可以返回包含由分隔符(例如逗号)分隔的值的 VARCHAR,也可以返回半结构化数据类型,例如 VARIANT

Python

请参阅 已知限制

Scala

请参阅 已知限制

使用 SQL 创建存储过程

您可以通过以下步骤使用 SQL 创建存储过程。

备注

也可以创建和调用不会存储起来以供以后使用的过程。该类过程的许多属性与存储过程相同。有关更多信息,请参阅 CALL(使用匿名过程)

  1. 编写在调用过程时执行的处理程序代码。

    可以使用受支持的某种处理程序语言。有关更多信息,请参阅 支持的语言和工具

  2. 选择是使用 CREATE PROCEDURE SQL 语句将处理程序代码内联,还是在暂存区上引用该代码。

    每种做法都有其优点。有关更多信息,请参阅 将处理程序代码保持内联或保留在暂存区

  3. 在 SQL 中执行 CREATE PROCEDURE 语句,指定过程的属性。

    以下示例中的代码创建一个名为 myProc 的过程,其包含内联处理程序 MyClass.myMethod。处理程序的语言是 Java,它需要使用 Snowpark 库中的 Session 对象(就像用 Scala 和 Python 编写的过程处理程序一样)。在这里,PACKAGES 子句引用了 Snowflake 附带的 Snowpark 库。

    CREATE OR REPLACE PROCEDURE myProc(fromTable STRING, toTable STRING, count INT)
      RETURNS STRING
      LANGUAGE JAVA
      RUNTIME_VERSION = '11'
      PACKAGES = ('com.snowflake:snowpark:latest')
      HANDLER = 'MyClass.myMethod'
      AS
      $$
        import com.snowflake.snowpark_java.*;
    
        public class MyClass
        {
          public String myMethod(Session session, String fromTable, String toTable, int count)
          {
            session.table(fromTable).limit(count).write().saveAsTable(toTable);
            return "Success";
          }
        }
      $$;
    
    Copy
语言: 中文