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

Snowflake SQL存储过程返回表数据时编译与执行报错求助

问题解决:Snowflake SQL存储过程返回表的语法修正

你的问题出在两个核心点:

  • 存储过程RETURNS TABLE()未指定具体列结构,Snowflake要求明确定义返回表的字段与对应数据类型
  • SQL语言的存储过程返回查询结果时,需将SELECT语句用括号包裹后搭配RETURN关键字

修改后的存储过程代码

CREATE OR REPLACE PROCEDURE sp_partition_ohlc(symbol VARCHAR(10), 
                                              from_time NUMERIC(20, 0), 
                                              til_time NUMERIC(20, 0),  
                                              step_time NUMERIC(20, 0))
    RETURNS TABLE(
        t NUMERIC(20,0),
        v NUMERIC(38,0),
        o NUMERIC(18,4),
        c NUMERIC(18,4),
        h NUMERIC(18,4),
        l NUMERIC(18,4),
        wv NUMERIC(38,4),
        n INTEGER
    )
    LANGUAGE SQL
    AS
    $$
    BEGIN
        RETURN (
            SELECT 
                :step_time * bucket AS t,
                SUM(T.volume) AS v,
                MAX(T.open) AS o,
                MAX(T.close) AS c,
                MAX(T.highlow) AS h,
                MIN(T.highlow) AS l,
                SUM(T.volume) * (MAX(T.highlow) + MIN(T.highlow) + MAX(T.close)) / 3 AS wv,
                COUNT(*) AS n
            FROM (
                SELECT
                    FLOOR(T.sip_timestamp / :step_time) AS bucket,
                    cta_calc(T.size, T.conditions, 'VOLUME') AS volume,
                    cta_calc(T.price, T.conditions, 'HIGHLOW') AS highlow,
                    IFF(ROW_NUMBER() OVER (PARTITION BY bucket ORDER BY T.sip_timestamp) = 1, T.price, NULL) AS open,
                    LAST_VALUE(cta_calc(T.price, T.conditions, 'LAST')) 
                        IGNORE NULLS OVER (PARTITION BY bucket ORDER BY T.sip_timestamp) AS close
                FROM trades AS T
                WHERE 
                    T.symbol = :symbol AND 
                    T.sip_timestamp >= :from_time AND
                    T.sip_timestamp < :til_time) AS T
            GROUP BY bucket
            ORDER BY bucket
        );
    END
    $$;

关键修正说明

  1. 明确返回表结构:把RETURNS TABLE()替换为包含所有返回列名和对应数据类型的定义(数据类型可根据实际业务调整),确保与查询结果字段完全匹配。
  2. 修正RETURN语法:将SELECT语句用括号包裹,写成RETURN (SELECT ...)的形式,这是Snowflake SQL存储过程返回查询结果的标准写法。
  3. 修复WV字段引用问题:原查询中v * (h + l + c) / 3会报错,因为聚合函数的别名无法在同一SELECT层级直接引用,因此替换为对应的聚合函数表达式SUM(T.volume) * (MAX(T.highlow) + MIN(T.highlow) + MAX(T.close)) / 3。

修改后执行调用语句CALL sp_partition_ohlc('NTAP', 1640995200000000000, 1672531200000000000, 3600000000000)即可正常返回结果。

内容的提问来源于stack exchange,提问作者Woody1193

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 16:50:30