2017-06-06 40 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分享这个。 –