调用存储过程¶
您可以通过几种方式之一调用存储过程。
用于调用过程的工具¶
选择用于调用过程的工具。
语言 |
方法 |
---|---|
SQL 执行 SQL 命令,例如使用 Snowsight。 |
执行 SQL CALL 命令 以调用过程。 |
使用 Snowpark 的 Java、Python 或 Scala 使用受支持的语言之一在本地编写代码,并在 Snowflake 中执行调用。 |
使用以下列语言之一执行使用 Snowpark APIs 的客户端代码。 |
命令行 通过从命令行执行命令来创建和管理 Snowflake 实体。 |
执行 Snowflake CLI 的命令: |
Python 在客户端,编写在 Snowflake 上执行管理操作的代码。 |
执行使用 Snowflake Python API 的代码。 |
**RESTful APIs**(与语言无关) 请求 RESTful 端点以创建和管理 Snowflake 实体。 |
发出请求以使用 Snowflake REST API 创建过程 |
具有调用存储过程的权限之后,就可以使用 CALL 语句来调用存储过程。
备注
要创建和调用匿名过程,请使用 CALL(使用匿名过程)。创建和调用匿名过程不需要具有 CREATE PROCEDURE 架构权限的角色。
使用说明¶
过程名称在架构中不一定是唯一的;存储过程由其实参类型及其名称标识和解析(即,存储过程可以重载)。
在 :doc:` Snowflake Scripting 块 </developer-guide/snowflake-scripting/blocks>` 之外,无法使用存储过程返回的值,因为该调用不能成为表达式的一部分。
在 Snowflake Scripting 块中,可以指定
INTO :snowflake_scripting_variable
,以便获取存储过程中 Snowflake Scripting 变量的返回值。存储过程不是原子的;如果存储过程中的一条语句失败,则存储过程中的其他语句不一定会回滚。有关存储过程和事务的信息,请参阅 事务管理。
您还可以使用 CALL(使用匿名过程) 创建和调用匿名过程。
使用 SQL 调用存储过程¶
如果存储过程具有实参,则可以按名称或位置指定这些实参。
例如,以下存储过程接受三个实参:
CREATE OR REPLACE PROCEDURE sp_concatenate_strings(
first_arg VARCHAR,
second_arg VARCHAR,
third_arg VARCHAR)
RETURNS VARCHAR
LANGUAGE SQL
AS
$$
BEGIN
RETURN first_arg || second_arg || third_arg;
END;
$$;
调用过程时,可以按名称指定实参:
CALL sp_concatenate_strings(
first_arg => 'one',
second_arg => 'two',
third_arg => 'three');
+------------------------+
| SP_CONCATENATE_STRINGS |
|------------------------|
| onetwothree |
+------------------------+
如果按名称指定实参,则不需要按任何特定顺序指定实参:
CALL sp_concatenate_strings(
third_arg => 'three',
first_arg => 'one',
second_arg => 'two');
+------------------------+
| SP_CONCATENATE_STRINGS |
|------------------------|
| onetwothree |
+------------------------+
您还可以按位置指定实参:
CALL sp_concatenate_strings(
'one',
'two',
'three');
+------------------------+
| SP_CONCATENATE_STRINGS |
|------------------------|
| onetwothree |
+------------------------+
请注意以下事项:
必须按名称或位置指定所有实参。不能按名称指定某些实参,也不能按位置指定其他实参。
按名称指定实参时,不能在实参名称前后使用双引号。
如果两个函数或两个过程的名称相同但实参类型不同,那么在实参名称不同的情况下,可以使用实参名称来指定要执行的函数或过程。请参阅 重载过程和函数。
指定可选实参¶
如果存储过程具有 可选实参,则可以在调用中省略可选实参。每个可选实参都有一个默认值,当省略该实参时将使用该默认值。
例如,以下存储过程具有一个必填实参和两个可选实参。每个可选实参都有一个默认值。
CREATE OR REPLACE PROCEDURE build_string_proc(
word VARCHAR,
prefix VARCHAR DEFAULT 'pre-',
suffix VARCHAR DEFAULT '-post'
)
RETURNS VARCHAR
LANGUAGE SQL
AS
$$
BEGIN
RETURN prefix || word || suffix;
END;
$$
;
您可以在调用中省略任何可选实参。省略实参时,将使用该实参的默认值。
CALL build_string_proc('hello');
+-------------------+
| BUILD_STRING_PROC |
|-------------------|
| pre-hello-post |
+-------------------+
CALL build_string_proc('hello', 'before-');
+-------------------+
| BUILD_STRING_PROC |
|-------------------|
| before-hello-post |
+-------------------+
如果需要省略可选实参,并在签名中指定出现在被省略实参之后的另一个可选实参,请使用命名实参,而不是位置实参。
例如,假设您要省略 prefix
实参,并指定 suffix
实参。suffix
实参显示在签名中的 prefix
之后,因此必须按名称指定实参:
CALL build_string_proc(word => 'hello', suffix => '-after');
+-------------------+
| BUILD_STRING_PROC |
|-------------------|
| pre-hello-after |
+-------------------+