sql-update - 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 查询(或多个查询)中定义逻辑,然后让数据库弄清楚如何进行实际工作。
在这种情况下,您可以一步完成整个比较。您实际上可以将其重写为单个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
推荐阅读
- flutter - How to know which module to import to use a class?
- javascript - Passing a variable between HTML pages using JavaScript
- python - 如何对列表列表重复一系列过程和计算?
- matlab - 如何正确应用 ODE45 求解器
- python-3.x - 如何将 tensorflow.python.framework.ops.EagerTensor 保存为文本?
- android - 如何将数据从 ArrayList 显示到 RecycleView?
- javascript - 从 HTML 字符串替换样式标记内的双引号以在 DOM 中正确呈现
- mysql - 使用 PDO 执行“SHOW PROCESSLIST”不会返回进程列表
- docker - Kong:缺少用于连接的数据库
- php - EA 插件给出 请确保这不是一个被遗忘的调试语句