[英]Cursor in Oracle PL/SQL
我正在嘗試編寫一個游標以在Oracle中完成任務。 我對Oracle中的游標不熟悉。 顯然,我在這方面做錯了。 有人可以告訴我這是什么嗎?
DECLARE
CURSOR c1 IS
SELECT BADGE.EMPID
FROM EVENTS
INNER JOIN BADGE ON EVENTS.CARDNUM = BADGE.ID
INNER JOIN EMP ON BADGE.EMPID = EMP.ID
WHERE EMP.VISITOR = 0
AND EVENTS.EVENT_TIME_UTC - 0.125 > TO_DATE('20090101 00:00:00', 'RRRRMMDD hh24:mi:ss')
AND EVENTS.EVENT_TIME_UTC - 0.125 < TO_DATE('20120101 23:59:59', 'RRRRMMDD hh24:mi:ss');
r1 c1%ROWTYPE;
BEGIN
FOR r1 IN c1 LOOP
UPDATE EVENTS
SET EVENTS.EMPID = r1.EMPID
END LOOP;
END;
謝謝你的幫助!
還有一種無需游標即可執行此操作的方法,但這就是您想要執行的操作。 關鍵是要定義光標,然后沿光標循環。 識別FOR UPDATE
DECLARE
CURSOR c1 IS
SELECT BADGE.EMPID
FROM EVENTS
INNER JOIN BADGE ON EVENTS.CARDNUM = BADGE.ID
INNER JOIN EMP ON BADGE.EMPID = EMP.ID
WHERE EMP.VISITOR = 0
AND EVENTS.EVENT_TIME_UTC - 0.125 > TO_DATE('20090101 00:00:00', 'RRRRMMDD hh24:mi:ss')
AND EVENTS.EVENT_TIME_UTC - 0.125 < TO_DATE('20120101 23:59:59', 'RRRRMMDD hh24:mi:ss')
FOR UPDATE of events.empid;
BEGIN
for l in c1 loop
UPDATE events
SET empid = l.empid
WHERE CURRENT OF c1;
end loop;
COMMIT;
end;
不使用隱式游標的解決方案(無鎖定問題):
Begin
For X in (
SELECT BADGE.EMPID, EVENTS.CARDNUM FROM EVENTS
INNER JOIN BADGE ON EVENTS.CARDNUM = BADGE.ID
INNER JOIN EMP ON BADGE.EMPID = EMP.ID
WHERE EMP.VISITOR = 0 AND
EVENTS.EVENT_TIME_UTC - 0.125 > TO_DATE('20090101 00:00:00', 'RRRRMMDD hh24:mi:ss') AND
EVENTS.EVENT_TIME_UTC - 0.125 < TO_DATE('20120101 23:59:59', 'RRRRMMDD hh24:mi:ss')
)
Loop
UPDATE EVENTS
SET EVENTS.EMPID = X.EMPID
WHERE EVENTS.CARDNUM = X.CARDNUM;
END LOOP;
COMMIT;
END;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.