从存储过程中进行选择

某些存储过程会返回表格数据。要选择和操作这些表格数据,可以在 SELECT 语句的 FROM 子句中调用这些存储过程。

运行具有 TABLE 关键字的 SELECT 语句

调用存储过程时,忽略 CALL 命令。相反,使用 TABLE 关键字,并在括号内命名过程:

SELECT ... FROM TABLE( <stored_procedure_name>( <arg> [ , <arg> ... ] ) );
Copy

从存储过程中进行选择的示例

此示例使用下表中的数据:

CREATE OR REPLACE TABLE orders (
  order_id INT,
  u_id VARCHAR,
  order_date DATE,
  order_amount NUMBER(12,2));

INSERT INTO orders VALUES (1, 'user_id_001', current_date, 500.00);
INSERT INTO orders VALUES (2, 'user_id_003', current_date, 225.00);
INSERT INTO orders VALUES (3, 'user_id_001', current_date, 725.00);
INSERT INTO orders VALUES (4, 'user_id_002', current_date, 150.00);
INSERT INTO orders VALUES (5, 'user_id_002', current_date, 900.00);
Copy

以下存储过程会返回基于用户 ID 的订单信息:

CREATE OR REPLACE PROCEDURE find_orders_by_user_id(user_id VARCHAR)
RETURNS TABLE (
  order_id INT, order_date DATE, order_amount NUMBER(12,2)
)
LANGUAGE SQL AS
DECLARE
  res RESULTSET;
BEGIN
  res := (SELECT order_id, order_date, order_amount FROM orders WHERE u_id = :user_id);
  RETURN TABLE(res);
END;
Copy

注意:如果您在 Python Connector 代码中使用 SnowSQLClassic Console 或者 execute_streamexecute_string 方法,请改用本示例(请参阅 在 SnowSQL、Classic Console 和 Python Connector 中使用 Snowflake Scripting):

CREATE OR REPLACE PROCEDURE find_orders_by_user_id(user_id VARCHAR)
RETURNS TABLE (
  order_id INT, order_date DATE, order_amount NUMBER(12,2)
)
LANGUAGE SQL AS
$$
DECLARE
  res RESULTSET;
BEGIN
  res := (SELECT order_id, order_date, order_amount FROM orders WHERE u_id = :user_id);
  RETURN TABLE(res);
END;
$$
;
Copy

以下 SELECT 语句将检索存储过程的结果:

SELECT * FROM TABLE(find_orders_by_user_id('user_id_001'));
Copy
+----------+------------+--------------+
| ORDER_ID | ORDER_DATE | ORDER_AMOUNT |
|----------+------------+--------------|
|        1 | 2024-08-30 |       500.00 |
|        3 | 2024-08-30 |       725.00 |
+----------+------------+--------------+

从存储过程中进行选择的限制

以下限制适用于从存储过程中进行选择:

  • 只有执行 SELECT、SHOW、DESCRIBE 或 CALL 语句的存储过程才能放在 SELECT 语句的 FROM 子句中。不允许使用 DDL 或 DML 操作进行修改的存储过程。对于发出 CALL 语句的存储过程,这些限制适用于调用的存储过程。

  • 只有返回带有静态输出架构的表格数据的存储过程才能放在 SELECT 语句的 FROM 子句中。必须为输出列指定名称和类型。例如,支持具有以下 RETURNS 子句的存储过程:

    RETURNS TABLE (col1 INT, col2 STRING)
    
    Copy

    不支持具有以下 RETURNS 子句的存储过程,因为它不返回表格数据:

    RETURNS STRING
    
    Copy

    不支持具有以下 RETURNS 子句的存储过程,因为它不提供固定的输出架构:

    RETURNS TABLE()
    
    Copy
  • 必须使用以下语句之一的 SELECT 块的 FROM 子句调用存储过程:

  • 存储过程不能接受来自其外部范围的相关输入实参,例如对任何在 SELECT 语句外定义的 CTE 的引用。

  • 如果实参包含子查询,则该子查询不能使用 WITH 子句定义的 CTE。

  • 包含存储过程调用的 SELECT 语句不能用于视图、用户定义的函数 (UDF)、用户定义的表函数 (UDTF) 或对象(如 行访问策略数据掩码策略)的主体中。

语言: 中文