首页 > 解决方案 > Amazon Redshift 中的光标声明

问题描述

我的目标是解析第一个表检查第二个表中是否存在 ID,然后进行一些更新。

第一个表循环运行并解析第二个表中的每一行以更新或给出输出。

这是我使用的代码:

DECLARE
CURSOR c1 FOR (SELECT pnr,agrnumber,pnrcreatedate FROM test2_view_table);
r1 c1%ROWTYPE;
CURSOR c2 FOR (SELECT pnr,ano,pcdt FROM sdh_ticket_test2_update);
r2 c2%ROWTYPE;
BEGIN
 FOR r1 IN c1
 LOOP
  FOR r2 IN c2
  LOOP
   IF (r1.pnr = r2.pnr and r2.pnrcreatedate is null  and 
r1.agrnumber=r2.ano)
   THEN
     c++
   else if (r1.pnr = r2.pnr and r2.agrnumber is null and  
r1.pcdt=r2.pnrcreatedate)
  THEN
      a++   -- continue to the next iteration of the outer loop
    -- as we have a match
    GOTO continue;
   END IF;
  END LOOP;
  -- we can only reach that point if there was no match
  DBMS_OUTPUT.PUT_LINE(TO_CHAR(c));
  <<continue>>
  NULL;

 END LOOP;
END; 

对于红移光标的声明,如上。它向我抛出以下错误。

[Amazon](500310) Invalid operation: syntax error at or near "c1" 

请让我知道是否有任何解决方案。

标签: sql-updatecursorfetchamazon-redshift

解决方案


这种逐行处理方式不适用于任何现代数据库。只需在 SQL 查询(或多个查询)中定义逻辑,然后让数据库弄清楚如何进行实际工作。

在这种情况下,您可以一步完成整个比较。您实际上可以将其重写为单个UPDATE.

BEGIN

UPDATE sdh_ticket_test2_update
SET    pnrcreatedate = c1.pcdt
FROM      test2_view_table c1
LEFT JOIN sdh_ticket_test2_update c2
       ON c1.pnr = c2.pnr 
      AND c1.agrnumber = c2.ano
WHERE c2.pnrcreatedate IS NULL 
;

UPDATE sdh_ticket_test2_update
SET    ano = c1.agrnumber
FROM      test2_view_table c1
LEFT JOIN sdh_ticket_test2_update c2
       ON c1.pnr = c2.pnr 
      AND c1.pcdt = c2.pnrcreatedate
WHERE c2.agrnumber IS NULL 
;

COMMIT

推荐阅读