在 Redshift 上的过程中结合使用 Cursor 和 UPDATE 语句的示例

An example of a Cursor & UPDATE statement in conjunction inside a procedure on Redshift

能否提供一个 Redshift 过程的示例,其中您结合使用了游标和 UPDATE 语句?这是否可行,我找不到例子。我正在寻找一个简单的模板代码来学习如何在 Redshift 上的一个过程中将这两个结合在一起。

这是一个示例用例:

我有一个 table 这样的:

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)       
   )

我想用另一个 table 的相对值更新每个 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; 

我一直收到错误消息

incorrect syntax at or near "cursor_testing"

我用类似的解决方案回答了一个问题。 SQL 使用游标的数据插入到 table 中,同样的路径应该适用于 UPDATE - How to join System tables or Information Schema tables with User defined tables in Redshift

话虽这么说,但看看您的代码,我真的认为您最好使用临时 table 而不是游标。首先要注意的是游标不是 table。您的使用模式将不起作用 AFAIK。您逐行(或成串)读取游标,这与 Redshift 的列式 table 存储相反。因此,您需要循环游标中的行并执行 N 次更新。这将非常慢!您将查询列式数据,将结果作为行存储在游标中,逐行读取这些行,然后对每一行执行新查询 (UPDATE)。恶心!留在“柱状地带”并使用临时 table.