从 Python 存储过程返回表格数据¶
您可以编写一个过程,以表格形式返回数据。若要编写返回表格数据的过程,请执行以下操作:
在 CREATE PROCEDURE 语句中指定
TABLE(...)
作为过程的返回类型。您可以指定返回数据的列名和 :doc:` 类型 </sql-reference-data-types>` (如果您知道)作为 TABLE 参数。如果在定义过程时不知道返回的列(例如在运行时指定列时),则可以省略参数 TABLE。如果执行此操作,过程的返回值列将通过其处理程序返回的
DataFrame
中的列进行转换。列数据类型将根据 SQL-Python 数据类型映射 中指定的映射转换为 SQL。编写处理程序,使其在 Snowpark DataFrame 中返回表格结果。
有关 DataFrame 的更多信息,请参阅 在 Snowpark Python 中使用 DataFrames。
示例¶
本节中的示例演示如何通过筛选列与字符串匹配的行的过程返回表格值。
定义数据¶
以下示例中的代码创建一个员工表。
CREATE OR REPLACE TABLE employees(id NUMBER, name VARCHAR, role VARCHAR);
INSERT INTO employees (id, name, role) VALUES (1, 'Alice', 'op'), (2, 'Bob', 'dev'), (3, 'Cindy', 'dev');
指定返回列名称和类型¶
此示例在 RETURNS TABLE()
语句中指定列名称和类型。
CREATE OR REPLACE PROCEDURE filterByRole(tableName VARCHAR, role VARCHAR)
RETURNS TABLE(id NUMBER, name VARCHAR, role VARCHAR)
LANGUAGE PYTHON
RUNTIME_VERSION = '3.9'
PACKAGES = ('snowflake-snowpark-python')
HANDLER = 'filter_by_role'
AS
$$
from snowflake.snowpark.functions import col
def filter_by_role(session, table_name, role):
df = session.table(table_name)
return df.filter(col("role") == role)
$$;
省略返回列名称和类型¶
以下示例中的代码声明一个过程,该过程允许通过处理程序返回值中的列推断返回值列名称和类型。它会忽略 RETURNS TABLE()
语句中的列名称和类型。
CREATE OR REPLACE PROCEDURE filterByRole(tableName VARCHAR, role VARCHAR)
RETURNS TABLE()
LANGUAGE PYTHON
RUNTIME_VERSION = '3.9'
PACKAGES = ('snowflake-snowpark-python')
HANDLER = 'filter_by_role'
AS
$$
from snowflake.snowpark.functions import col
def filter_by_role(session, table_name, role):
df = session.table(table_name)
return df.filter(col("role") == role)
$$;
调用过程¶
下面的示例调用存储过程:
CALL filterByRole('employees', 'dev');
过程调用生成以下输出:
+----+-------+------+
| ID | NAME | ROLE |
+----+-------+------+
| 2 | Bob | dev |
| 3 | Cindy | dev |
+----+-------+------+