创建存储过程¶
使用 CREATE PROCEDURE 命令来创建存储过程,该命令指定过程的属性(包括要用于过程逻辑的处理程序)。
本主题列出了创建过程的步骤。有关示例,请参阅 CREATE PROCEDURE 参考。
备注
也可以创建和调用不会存储起来以供以后使用的过程。该类过程的许多属性与存储过程相同。有关更多信息,请参阅 CALL(使用匿名过程)。
创建存储过程¶
使用以下步骤创建存储过程:
编写在调用过程时执行的处理程序代码。
可以使用受支持的某种处理程序语言。有关更多信息,请参阅 支持的语言。
选择是使用 CREATE PROCEDURE SQL 语句将处理程序代码内联,还是在暂存区上引用该代码。
每种做法都有其优点。有关更多信息,请参阅 将处理程序代码保持内联或保留在暂存区。
在 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"; } } $$;
下面介绍创建过程时需要或通常使用的一些属性。
过程名称。
此名称不需要与处理程序的名称匹配。CREATE PROCEDURE 语句会将过程名称与处理程序相关联。
有关名称约束和约定的更多信息,请参阅 命名和重载过程和 UDFs。
过程实参(如果有)。
请参阅 定义 UDFs 和存储过程的实参。
RETURNS 子句的返回类型。
有关 Snowflake 如何将 SQL 数据类型映射到处理程序数据类型的信息,请参阅 SQL-Java 数据类型映射。
HANDLER 子句的处理程序名称。
需要此属性时,它是类或方法的名称,该类或方法包含了调用过程时执行的代码。只需要为用 Java、Python 和 Scala 编写的处理程序指定处理程序名称。对于 JavaScript 和 Snowflake Scripting 处理程序,以内联方式指定的所有代码都将作为处理程序执行。
下表描述了基于处理程序语言的 HANDLER 子句值的形式。
处理程序语言
值形式
Java
类和方法名称。
例如:
MyClass.myMethod
JavaScript
无。
Python
类和方法名称(如果使用类),否则为函数名称。
例如:
module.my_function
或my_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"
$$;
暂存的处理程序¶
以下示例中的代码创建一个名为 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';