PgAdmin4(PostgreSQL 8.4)存储过程临时表返回语法错误求助
问题解决:PostgreSQL存储过程
RETURNS TABLE语法错误 错误原因
PostgreSQL中PROCEDURE(存储过程)不支持RETURNS TABLE语法,这是你遇到syntax error at or near "TABLE"报错的核心原因。PROCEDURE的设计定位是执行数据修改、DDL等操作,若要返回结果集,应使用FUNCTION(函数),或在PROCEDURE中通过游标输出参数实现。
解决方案
方案1:改为FUNCTION(推荐,适合返回结果集场景)
将CREATE PROCEDURE替换为CREATE FUNCTION,保留RETURNS TABLE定义,调整后的完整代码如下:
CREATE OR REPLACE FUNCTION sp_getOfficeStateData ( INOUT PROCESSING_DATE_YMD CHAR(06), INOUT TYPE_OF_RUN VARCHAR(1) ) RETURNS TABLE( STATES_WITHIN_OFFI_SF_DISION VARCHAR(3), STATES_WITHIN_MIS_ST_P_UNIT VARCHAR(3), STATES_WITHIN_PROCESSING_UNIT VARCHAR(2), STATES_WITHIN_STATE_INITIALS VARCHAR(2), STATES_WITHIN_GEOGRAPHIC_STATE VARCHAR(2), STATES_WITHIN_ALPH_ORDER_STATE_NO VARCHAR(2) ) LANGUAGE plpgsql AS $$ BEGIN CREATE TEMP TABLE IF NOT EXISTS ALL_OF_THE_OFF_OR_ST_DATA( STATES_WITHIN_OFFI_SF_DISION VARCHAR(3), STATES_WITHIN_MIS_ST_P_UNIT VARCHAR(3), STATES_WITHIN_PROCESSING_UNIT VARCHAR(2), STATES_WITHIN_STATE_INITIALS VARCHAR(2), STATES_WITHIN_GEOGRAPHIC_STATE VARCHAR(2), STATES_WITHIN_ALPH_ORDER_STATE_NO VARCHAR(2) ) ON COMMIT DROP; -- 在此添加临时表填充逻辑,示例: -- INSERT INTO ALL_OF_THE_OFF_OR_ST_DATA -- SELECT col1, col2, ... FROM your_source_table WHERE ...; RETURN QUERY SELECT * FROM ALL_OF_THE_OFF_OR_ST_DATA; END; $$;
方案2:保留PROCEDURE,用游标返回结果集
若必须使用PROCEDURE,可添加REF CURSOR类型的输出参数来返回结果集,代码示例:
CREATE OR REPLACE PROCEDURE sp_getOfficeStateData ( INOUT PROCESSING_DATE_YMD CHAR(06), INOUT TYPE_OF_RUN VARCHAR(1), OUT result_cursor REFCURSOR ) LANGUAGE plpgsql AS $$ BEGIN CREATE TEMP TABLE IF NOT EXISTS ALL_OF_THE_OFF_OR_ST_DATA( STATES_WITHIN_OFFI_SF_DISION VARCHAR(3), STATES_WITHIN_MIS_ST_P_UNIT VARCHAR(3), STATES_WITHIN_PROCESSING_UNIT VARCHAR(2), STATES_WITHIN_STATE_INITIALS VARCHAR(2), STATES_WITHIN_GEOGRAPHIC_STATE VARCHAR(2), STATES_WITHIN_ALPH_ORDER_STATE_NO VARCHAR(2) ) ON COMMIT DROP; -- 在此添加临时表填充逻辑 -- INSERT INTO ALL_OF_THE_OFF_OR_ST_DATA -- SELECT col1, col2, ... FROM your_source_table WHERE ...; OPEN result_cursor FOR SELECT * FROM ALL_OF_THE_OFF_OR_ST_DATA; END; $$;
注意事项
- 原代码中临时表未填充数据,需添加
INSERT语句从数据源导入数据,否则返回空结果集。 - PostgreSQL中FUNCTION与PROCEDURE的核心区别:FUNCTION可返回结果集,支持
RETURNS子句;PROCEDURE主要用于执行无返回或通过输出参数返回的操作,无RETURNS子句。
内容的提问来源于stack exchange,提问作者Sandeep Kumar
相关产品推荐
相关产品推荐

