从存储过程中进行选择¶
某些存储过程会返回表格数据。要选择和操作这些表格数据,可以在 SELECT 语句的 FROM 子句中调用这些存储过程。
运行具有 TABLE 关键字的 SELECT 语句¶
调用存储过程时,忽略 CALL 命令。相反,使用 TABLE 关键字,并在括号内命名过程:
SELECT ... FROM TABLE( <stored_procedure_name>( <arg> [ , <arg> ... ] ) );
从存储过程中进行选择的示例¶
此示例使用下表中的数据:
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);
以下存储过程会返回基于用户 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;
注意:如果您在 Python Connector 代码中使用 SnowSQL、Classic Console 或者 execute_stream
或 execute_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;
$$
;
以下 SELECT 语句将检索存储过程的结果:
SELECT * FROM TABLE(find_orders_by_user_id('user_id_001'));
+----------+------------+--------------+
| 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)
不支持具有以下 RETURNS 子句的存储过程,因为它不返回表格数据:
RETURNS STRING
不支持具有以下 RETURNS 子句的存储过程,因为它不提供固定的输出架构:
RETURNS TABLE()
必须使用以下语句之一的 SELECT 块的 FROM 子句调用存储过程:
存储过程不能接受来自其外部范围的相关输入实参,例如对任何在 SELECT 语句外定义的 CTE 的引用。
如果实参包含子查询,则该子查询不能使用 WITH 子句定义的 CTE。
包含存储过程调用的 SELECT 语句不能用于视图、用户定义的函数 (UDF)、用户定义的表函数 (UDTF) 或对象(如 行访问策略 和 数据掩码策略)的主体中。