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 $$;
关键修正说明
- 明确返回表结构:把
RETURNS TABLE()替换为包含所有返回列名和对应数据类型的定义(数据类型可根据实际业务调整),确保与查询结果字段完全匹配。 - 修正RETURN语法:将SELECT语句用括号包裹,写成
RETURN (SELECT ...)的形式,这是Snowflake SQL存储过程返回查询结果的标准写法。 - 修复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
相关产品推荐
相关产品推荐

