2014-10-31 34 views
0

我試圖通過選擇更新中使用的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; 
/

回答

0

Select for update是一個編程工具,您可以使用它來確保沒有其他人更新您的數據。在你的內部PL/SQL,你可以使用rows locked for update,然後進行所需的交易。您的更改爲Commit,Oracle將發佈lock mode 3

你可以簡單地做,

 
Open cur for 
select column_list from table where .... 

不是說具體,但是,這asktom鏈接關於select for ...update是一個很好的閱讀https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:927629362932

您可能也有興趣知道一些有關條款有趣的事情,這裏是我對神話的看法select..for updatehttp://lalitkumarb.wordpress.com/2014/09/04/a-myth-about-row-exclusive-table-lock-on-select-for-update-with-no-rows/

希望它有幫助!

+0

謝謝Lalit,我嘗試了你的建議,但現在編譯時出錯了。你能建議出了什麼問題嗎?已更新該帖子。 – 2014-10-31 15:24:11

+0

不,這不是我所建議的。用於pl/sql代碼內的事務的update子句。僅爲select語句打開遊標,此處沒有更新子句。並且,請在'SQL * Plus'中編譯您的代碼,並使用'SHOW ERROR'來查看'錯誤堆棧'。複製粘貼整個事情。 – 2014-10-31 15:27:48

+0

我不明白,如果我不會鎖定由curser選擇的數據,那麼我們如何才能在這個實例更新它之前使用相同的數據。我不是一個普通的數據庫人,所以我的理解是少一點... – 2014-10-31 21:33:52