调用存储过程

您可以通过几种方式之一调用存储过程。

用于调用过程的工具

选择用于调用过程的工具。

语言

方法

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            |
+------------------------+

备注

  • 必须按名称或位置指定所有实参。不能按名称指定某些实参,也不能按位置指定其他实参。

  • When you specify an argument by name, you can't use double quotes around the argument name.

  • If two procedures have the same name but different argument types, you can use the argument names to specify which procedure to execute, if the argument names are different. For more information, see 重载过程和函数.

指定可选实参

如果存储过程具有 可选实参,则可以在调用中省略可选实参。每个可选实参都有一个默认值,当省略该实参时将使用该默认值。

例如,以下存储过程具有一个必填实参和两个可选实参。每个可选实参都有一个默认值。

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   |
+-------------------+