【发布时间】:2021-10-12 03:56:58
【问题描述】:
您能否提供一个 Redshift 过程的示例,其中您结合使用了游标和 UPDATE 语句?这是否可行,我找不到一个例子。我正在寻找一个简单的模板代码来学习如何在 Redshift 上的一个过程中将这两个结合在一起。
这是一个示例用例:
我有一张这样的桌子:
CREATE TABLE test_tbl
(
Contactid VARCHAR(500),
sfdc_OppId_01 VARCHAR(500),
sfdc_OppId_02 VARCHAR(500),
sfdc_OppId_03 VARCHAR(500),
sfdc_OppId_04 VARCHAR(500),
sfdc_OppId_05 VARCHAR(500),
sfdc_OppId_06 VARCHAR(500)
)
我想用另一个表的相对值更新每个 sfdc_OppId_xx; sfdc_tbl。这是 sfdc_tbl 的样子:
| sfdc_contactId | sfdc_Opp_Id |
|---|---|
| AA123hgt | 999999 |
| AA123hgt | 888888 |
| AA123hgt | 777777 |
| AA123hgt | 432567 |
| AA123hgt | 098765 |
| AA123hgt | 112789 |
如您所见,sfdc_tbl 中有重复的 sfdc_contactid。我的最终目标是在 test_tbl 中水平列出给定 contactid 的所有 sfdc_Opp_Id。我不会在 test_tbl 中有重复的 contactid。
INSERT INTO test_tbl (Contactid)
SELECT sfdc_contactId
FROM sfdc_tbl
GROUP BY sfdc_contactId
这就是我想要做的:
CREATE OR REPLACE PROCEDURE testing_procedure (results INOUT refcursor)
AS
$$
BEGIN
OPEN cursor_testing FOR
SELECT
Ops.sfdc_Opp.id,
ROW_NUMBER () OVER(PARTITION BY Ops.sfdc_contactId ORDER BY sfdc_Opp_Id ) RWN
FROM sfdc_tbl Ops
INNER JOIN test_tbl tbl
ON Ops.sfdc_contactId = tbl.contactid;
UPDATE test_tbl
SET sfdc_Opp_01 = CASE WHEN cursor_testing.RWN = 1 THEN cursor_testing.sfdc_Ops_id ELSE NULL END,
sfdc_Opp_02 = CASE WHEN cursor_testing.RWN = 2 THEN cursor_testing.sfdc_Ops_id ELSE NULL END,
sfdc_Opp_03 = CASE WHEN cursor_testing.RWN = 3 THEN cursor_testing.sfdc_Ops_id ELSE NULL END,
sfdc_Opp_04 = CASE WHEN cursor_testing.RWN = 4 THEN cursor_testing.sfdc_Ops_id ELSE NULL END,
sfdc_Opp_05 = CASE WHEN cursor_testing.RWN = 5 THEN cursor_testing.sfdc_Ops_id ELSE NULL END,
sfdc_Opp_06 = CASE WHEN cursor_testing.RWN = 6 THEN cursor_testing.sfdc_Ops_id ELSE NULL END
;
END;
$$
LANGUAGE plpgsql;
我不断收到错误
“cursor_testing”处或附近的语法不正确
【问题讨论】:
-
这个方法的可靠性没有cmets(比尔写的好东西所以听他的)但具体的问题是你没有声明变量,所以光标是未知的。查看 PL/pgSQL 中的“声明”。
标签: stored-procedures amazon-redshift plpgsql database-cursor