AWS Redshift存储过程插入后获取ID报错:RETURNING语法错误
问题分析与解决方案
错误原因
AWS Redshift的PL/pgSQL实现**不支持直接在INSERT语句后使用RETURNING ... INTO**的语法,这是它与标准PostgreSQL的关键差异之一。你的代码中直接用RETURNING ID INTO v_WorkflowID的写法不符合Redshift的语法规范,导致了语法错误。
另外你代码里还有一个潜在问题:IF条件中引用的WorkflowID未在DECLARE中定义,应该改为你声明的v_WorkflowID,否则会触发未定义变量的错误。
修改后的存储过程
CREATE OR REPLACE PROCEDURE myschema.uspgtest(paramname varchar(10), runID int, INOUT activitylogid integer) LANGUAGE plpgsql AS $$ DECLARE v_WorkflowID BIGINT; Status VARCHAR(100) DEFAULT ''; cnt INT; BEGIN ----Internal SQL Codes---- ----The below code is part of main code----- IF (v_WorkflowID IS NULL OR Status = 'Completed' OR cnt = 0) THEN -- 改用嵌套子查询+SELECT INTO获取返回ID SELECT ID INTO v_WorkflowID FROM ( INSERT INTO myschema."Table_1" ("Status", "CreatedDatetime", "UpdatedDatetime", "Type") VALUES ('In-Progress', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, paramname) RETURNING ID ) AS inserted; END IF; -- 同样处理第二个INSERT的RETURNING逻辑 SELECT ActivityLogID INTO activitylogid FROM ( INSERT INTO myschema."Table_2" ("ParentActivityLogID", "CreatedDateTime", "UpdatedDateTime", "WorkflowID","RunID") VALUES (0, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, v_WorkflowID, runID) RETURNING ActivityLogID ) AS inserted; END; $$
说明
Redshift要求将INSERT ... RETURNING包装为子查询,再通过SELECT INTO将返回值赋值给变量,这是符合Redshift PL/pgSQL语法规范的写法。同时修正了IF条件中变量名的笔误,避免后续运行时出现未定义变量的错误。
内容的提问来源于stack exchange,提问作者pythondumb
相关产品推荐
相关产品推荐

