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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 04:42:25