我試圖通過選擇更新中使用的refcursor返回數據,但我無法找到任何方法。任何人都可以引導我。選擇更新後返回refcursor
CREATE OR REPLACE PROCEDURE SELECT_SCHEDULED_REPORTS
(o_scheduledreports_cursor OUT SYS_REFCURSOR)
IS
CURSOR report_ids
IS
SELECT *
FROM dwp_rep_scheduler_t
WHERE SCHEDULE_ID IN
(SELECT SCHEDULE_ID
FROM
(SELECT *
FROM dwp_rep_scheduler_t a
WHERE status = 1
AND schedule_type = 1
ORDER BY a.start_date
)
WHERE ROWNUM <= 5
) FOR UPDATE OF status;
BEGIN
FOR report_id IN report_ids
LOOP
UPDATE dwp_rep_scheduler_t SET status = 2 WHERE CURRENT OF report_ids;
END LOOP;
COMMIT;
-- can I do something like open o_scheduledreports_cursor for report_ids
END;
/
如@Lalit庫馬爾乙建議的,我試圖以下但現在它與誤差編譯爲「PLS-00221:‘O_SCHEDULEDREPORTS_CURSOR’不是過程或未定義」
CREATE OR REPLACE PROCEDURE SELECT_SCHEDULED_REPORTS (
o_scheduledreports_cursor OUT SYS_REFCURSOR)
IS
begin
open o_scheduledreports_cursor for
SELECT *
FROM dwp_rep_scheduler_t
WHERE SCHEDULE_ID IN (SELECT SCHEDULE_ID
FROM ( SELECT *
FROM dwp_rep_scheduler_t a
WHERE status = 1 AND schedule_type = 1
ORDER BY a.start_date)
WHERE ROWNUM <= 5)
FOR UPDATE OF status;
BEGIN
FOR report_id IN o_scheduledreports_cursor
LOOP
UPDATE dwp_rep_scheduler_t
SET status = 2
WHERE CURRENT OF report_ids;
END LOOP;
COMMIT;
END;
END SELECT_SCHEDULED_REPORTS;
/
謝謝Lalit,我嘗試了你的建議,但現在編譯時出錯了。你能建議出了什麼問題嗎?已更新該帖子。 – 2014-10-31 15:24:11
不,這不是我所建議的。用於pl/sql代碼內的事務的update子句。僅爲select語句打開遊標,此處沒有更新子句。並且,請在'SQL * Plus'中編譯您的代碼,並使用'SHOW ERROR'來查看'錯誤堆棧'。複製粘貼整個事情。 – 2014-10-31 15:27:48
我不明白,如果我不會鎖定由curser選擇的數據,那麼我們如何才能在這個實例更新它之前使用相同的數據。我不是一個普通的數據庫人,所以我的理解是少一點... – 2014-10-31 21:33:52