创建存储过程¶
使用 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 使用默认值(将来可能会有变)。
示例¶
以下各部分包含用不同语言创建存储过程的示例:
有关 Java 存储过程的示例,请参阅 使用 Java 编写存储过程。
有关 JavaScript 存储过程的示例,请参阅 使用 JavaScript 编写存储过程。
有关 Python 存储过程的示例,请参阅 使用 Python 编写存储过程。
有关 Scala 存储过程的示例,请参阅 使用 Scala 编写存储过程。
有关 Snowflake Scripting 存储过程的示例,请参阅 使用 Snowflake Scripting 编写存储过程。
以下各部分提供了内联处理程序和暂存的处理程序的示例。
内联处理程序¶
以下示例中的代码创建一个名为 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.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"
$$;
暂存的处理程序¶
以下示例中的代码创建一个名为 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')
IMPORTS = ('@mystage/myjar.jar')
HANDLER = 'MyClass.myMethod';