You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Snowflake Python存储过程绑定变量报错:意外的'%'

问题解决:Snowpark存储过程中绑定变量的正确用法

你遇到的报错是因为Snowpark Python API的sql()方法不支持%s这种占位符格式,这和你之前用的sqlalchemy、snowflake.connector的语法不同。同时你的代码里还有参数名不匹配的问题,handler函数的参数定义和实际引用不一致,需要一并修正。

错误原因解析

  1. Snowpark的sql()方法不识别%s,它采用**命名参数(:param)或位置参数(?)**的绑定方式。
  2. 你定义的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 01:20:04