创建存储过程

使用 CREATE PROCEDURE 命令来创建存储过程,该命令指定过程的属性(包括要用于过程逻辑的处理程序)。

本主题列出了创建过程的步骤。有关示例,请参阅 CREATE PROCEDURE 参考

备注

也可以创建和调用不会存储起来以供以后使用的过程。该类过程的许多属性与存储过程相同。有关更多信息,请参阅 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

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

    • 过程名称。

      此名称不需要与处理程序的名称匹配。CREATE PROCEDURE 语句会将过程名称与处理程序相关联。

      有关名称约束和约定的更多信息,请参阅 命名和重载过程和 UDFs

    • 过程实参(如果有)。

      请参阅 定义 UDFs 和存储过程的实参

    • RETURNS 子句的返回类型。

      有关 Snowflake 如何将 SQL 数据类型映射到处理程序数据类型的信息,请参阅 SQL-Java 数据类型映射

    • HANDLER 子句的处理程序名称。

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

      下表描述了基于处理程序语言的 HANDLER 子句值的形式。

      处理程序语言

      值形式

      Java

      类和方法名称。

      例如:MyClass.myMethod

      JavaScript

      无。

      Python

      类和方法名称(如果使用类),否则为函数名称。

      例如:module.my_functionmy_function

      Scala

      对象和方法名称。

      例如:MyObject.myMethod

      Snowflake Scripting

      无。

    • 使用 IMPORTS 或 PACKAGES 子句时,处理程序所需的依赖项(如果有)。

      对于用 Java、Python 或 Scala 编写的处理程序,请务必指定 Snowpark 库,如 CREATE PROCEDURE 参考中所述。

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

    • RUNTIME_VERSION 子句的处理程序语言运行时。

      当处理程序语言是 Java、Python 或 Scala 时,使用 RUNTIME_VERSION 子句指定要使用的受支持的运行时版本。省略该子句将提示 Snowflake 使用默认值(将来可能会有变)。

示例

内联处理程序

以下示例中的代码创建一个名为 my_proc 的过程,其包含内联的 Python 处理程序函数 run。通过 PACKAGES 子句,代码引用了随附的适用于 Python 的 Snowpark 库(当 Python 是过程处理程序语言时,需要使用该库中的 Session)。

CREATE OR REPLACE PROCEDURE my_proc(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

暂存的处理程序

以下示例中的代码创建一个名为 my_proc 的过程,其包含暂存的 Java 处理程序方法 MyClass.myMethod。通过 PACKAGES 子句,代码引用了随附的适用于 Java 的 Snowpark 库(当 Java 是过程处理程序语言时,需要使用该库中的 Session)。而通过 IMPORTS 子句,代码引用了包含处理程序代码的暂存 JAR 文件。

CREATE OR REPLACE PROCEDURE my_proc(fromTable STRING, toTable STRING, count INT)
  RETURNS STRING
  LANGUAGE JAVA
  RUNTIME_VERSION = '11'
  PACKAGES = ('com.snowflake:snowpark:latest')
  IMPORRTS = ('@mystage/myjar.jar')
  HANDLER = 'MyClass.myMethod';
Copy
语言: 中文