2017-06-06 41 views
1

對不起,另外代碼不對。我所要做的只是將變量YM1(201702,201703,201704)增加一個月,執行SQL語句並使用CURSOR顯示結果。帶有LOOP的遊標

當前行爲:YM1變量不遞增。該代碼執行但始終使用。

YEAR_MONTH 201701 201702 0 
YEAR_MONTH 201701 201703 0 
YEAR_MONTH 201701 201704 0 

預期的結果:

YEAR_MONTH 201701 201702 0 
YEAR_MONTH 201701 201703 10 
YEAR_MONTH 201701 201704 20 

請讓我知道我錯過了什麼。打破了我的頭。非常感謝時間。

set serveroutput on 

DECLARE 
    YM VARCHAR2(10) := '201701'; 
    YM1 VARCHAR2(10) := '201702'; 
    row1 number := 0; 

    CURSOR counts is 
     SELECT COUNT(*) 
     FROM **table1 a** 
     WHERE a.year_month = YM 
     AND EXISTS 
       (SELECT 'Y' 
       FROM **table2 b** 
       WHERE a.id = b.id 
       AND b.year_month = YM1); 
BEGIN 
    OPEN counts; 
    LOOP 
     FETCH counts INTO row1; 
     dbms_output.put_line('YEAR_MONTH '||YM||' '||YM1||' '||row1); 
     YM1 := TO_CHAR(ADD_MONTHS(TO_DATE(YM1,'YYYY-MM'), +1), 'YYYYMM'); 
     EXIT WHEN YM1 > '201704' 
    END LOOP; 
    CLOSE counts; 
END; 
/

回答

1

的問題是,當你打開遊標它選擇所有匹配的記錄YM1變量在開放時。所以你的循環將獲取一行耗盡遊標。下一次讀取沒有任何內容,因此row1的值不會更新。

要拿起你需要打開和關閉光標每次新鮮值:

DECLARE 
    YM VARCHAR2(10) := '201701' 
    YM1 VARCHAR2(10) := '201702' 
    row1 number := 0; 
    CURSOR counts is 
    SELECT COUNT(*) 
    FROM table1 a 
    WHERE a.YEAR_MONTH = YM 
    AND EXISTS (SELECT 'Y' 
       FROM table2 b 
       WHERE a.id = b.id 
       AND b.YEAR_MONTH = YM1); 
BEGIN 
    LOOP 
    OPEN counts; 
    FETCH counts INTO row1; 
    dbms_output.put_line('YEAR_MONTH '||YM||' '||YM1||' '||row1); 
    YM1 := TO_CHAR(ADD_MONTHS(TO_DATE(YM1,'YYYY-MM'), +1), 'YYYYMM'); 
    EXIT WHEN YM1 > '201704' 
    CLOSE counts; 
    END LOOP; 
END; 
/
0

作爲循環的一部分沒有發生增量,所以它總是相同的。 我不確定你是否假設這是增加YM1值的邏輯,但它永遠不會這樣做。 ADD_MONTHS(TO_DATE(YM1,'YYYY-MM'),+1)

你試圖增加YM嗎? YM1:= TO_CHAR(ADD_MONTHS(TO_DATE(YM1,'YYYY-MM'),+1),'YYYYMM');嘗試使用以下語句增量YM1 YM1:

編輯您所提供的輸出..

set serveroutput on 
DECLARE 
YM VARCHAR2(10) := '201701'; 
YM1 VARCHAR2(10) := '201702'; 
BEGIN 
dbms_output.put_line('   Timing  YM  YM1'); 
dbms_output.put_line('Before Increment'||YM||' '||YM1); 
LOOP 
    YM1 := TO_CHAR(ADD_MONTHS(TO_DATE(YM1,'YYYY-MM'), +1), 'YYYYMM'); 
    dbms_output.put_line('After Increment '||YM||' '||YM1); 
    EXIT WHEN YM1 > '201704'; 
END LOOP; 
END; 
/

Timing  YM  YM1 
Before Increment201701 201702 
After Increment 201701 201703 
After Increment 201701 201704 
After Increment 201701 201705 


PL/SQL procedure successfully completed. 

我只是執行刪除表和光標..

+0

我試圖增加YM1。這是我上面粘貼的代碼中的一個拼寫錯誤,我使用了YM1:= TO_CHAR(ADD_MONTHS(TO_DATE(YM1,'YYYY-MM'),+1),'YYYYMM');請參閱** CURRENT RESULT **,YM是相同的(201701),但YM1只會在結果(201702,201703,201704)中遞增。希望這是明確的。 –

+0

我剛剛給你我的執行輸出,它正在遞增..檢查一次 – Venkat

+0

我想增加YM1並在EXISTS子句內的CURSOR塊中使用它。你的代碼缺少CURSOR,這是我想要實現的。感謝fir分享這個。 –