Snowflake Python存储过程绑定变量报错:意外的'%'
问题解决:Snowpark存储过程中绑定变量的正确用法
你遇到的报错是因为Snowpark Python API的sql()方法不支持%s这种占位符格式,这和你之前用的sqlalchemy、snowflake.connector的语法不同。同时你的代码里还有参数名不匹配的问题,handler函数的参数定义和实际引用不一致,需要一并修正。
错误原因解析
- Snowpark的
sql()方法不识别%s,它采用**命名参数(:param)或位置参数(?)**的绑定方式。 - 你定义的handler函数参数是
def insert_proc(snowpark_session, x, y),但代码里引用了y_date,这会导致变量未定义的错误。
修正后的存储过程代码
以下是两种可行的修正方案:
方案一:使用命名绑定参数
CREATE OR REPLACE PROCEDURE insert_proc( x STRING, y_date DATE ) RETURNS STRING LANGUAGE PYTHON RUNTIME_VERSION = '3.8' HANDLER = 'insert_proc' PACKAGES = ('snowflake-snowpark-python') EXECUTE AS CALLER AS $$ def insert_proc(snowpark_session, x, y_date): # 使用命名参数: x和:y_date,通过params字典传递变量 snowpark_session.sql( "INSERT INTO TABLE_NAME_HERE (X, Y_DATE) VALUES (:x, :y_date)", params={"x": x, "y_date": y_date} ).collect() return 'inserted successfully' $$
方案二:使用位置绑定参数
CREATE OR REPLACE PROCEDURE insert_proc( x STRING, y_date DATE ) RETURNS STRING LANGUAGE PYTHON RUNTIME_VERSION = '3.8' HANDLER = 'insert_proc' PACKAGES = ('snowflake-snowpark-python') EXECUTE AS CALLER AS $$ def insert_proc(snowpark_session, x, y_date): # 使用?作为位置占位符,按顺序传递变量元组 snowpark_session.sql( "INSERT INTO TABLE_NAME_HERE (X, Y_DATE) VALUES (?, ?)", (x, y_date) ).collect() return 'inserted successfully' $$
验证调用
你的调用语句不需要修改,直接执行即可:
CALL insert_proc('999', '2024-10-17');
内容的提问来源于stack exchange,提问作者foxbundle
相关产品推荐
相关产品推荐

