游标中的Oracle Cursor

时间:2015-09-01 12:52:26

标签: oracle cursor

我有什么:

立法是 2004-2009 2009-2014

在2004 - 2009年的立法中,你已经有了多年的时间。 2004年 2004- 2005年 2005-2006 2006-2007 2008-2009

我想循环每一个立法机构,让每一年都有这样的事情。及其随后的“年份”     我必须遗漏一些东西,因为它没有结果。 当我在没有立法指标的情况下运行它时,它完美地运行 我只是希望它在立法机关中运行多年,当进入下面的立法机构时,它需要在那一年重新启动。

DECLARE
c_zj zittingsjaren.zittingsjaar%type;
c_zj_next varchar2(20);
c_lgl varchar2(20);

CURSOR c_legislatuur IS
select legislatuur as c_lgl
from core_admin.legislaturen
where legislatuur = '2004-2009';

CURSOR c_zittingsjaren IS
 SELECT  zittingsjaar, lead(zittingsjaar) over (order by zittingsjaar) as c_zj_next
         FROM  core_admin.zittingsjaren zj
        JOIN  core_admin.legislaturen lgl ON (zj.id_lgl = lgl.id)
        WHERE lgl.LEGISLATUUR = c_lgl;

BEGIN

FOR r_legislatuur in c_legislatuur LOOP

FOR r_zittingsjaren in c_zittingsjaren LOOP

INSERT INTO DEC_STAT_DECR 
              ( id_pobj
              , decr_type
              , titel
              , zittingsjaar
              , zittingsjaar_behandeld
              , legislatuur
              , status
              , status_nummer
              , fractie
              , bevoegdheid )
SELECT id_pobj
      , decr_type
      , titel
      , zittingsjaar
      , zittingsjaar_behandeld
      , legislatuur
      , 'NVT' -- Status  'NVT' om zo échte dubbels te vermijden, elke keer filteren op 'NVT' in andere grafieken/tabellen
      , '(5) te behandelen of in behandeling = (1)+(2)-(3)-(4)'
      , fractie
      , bevoegdheid
FROM DEC_STAT_DECR
WHERE id_pobj in(
  SELECT id_pobj
  FROM (
    SELECT id_pobj
    FROM dec_stat_decr 
    WHERE zittingsjaar_behandeld = r_zittingsjaren.zittingsjaar 
    AND DECR_TYPE in('VOORSTEL VAN RESOLUTIE')
    AND status_nummer in( '(1) nog niet afgehandeld op het einde van het vorige zittingsjaar', '(2) ingediend') 
    MINUS
    SELECT id_pobj
    FROM dec_stat_decr 
    WHERE zittingsjaar_behandeld = r_zittingsjaren.zittingsjaar -- zittingsjaar
          AND DECR_TYPE in('VOORSTEL VAN RESOLUTIE')
          AND status_nummer in( '(3) ingetrokken', '(4) behandeld in samenhand met een ontwerp of ander voorstel van decreet')  
    )

)
AND zittingsjaar_behandeld = r_zittingsjaren.zittingsjaar
  AND DECR_TYPE in('VOORSTEL VAN RESOLUTIE')
group by id_pobj, decr_type, titel, zittingsjaar, zittingsjaar_behandeld, legislatuur, fractie, bevoegdheid;
commit;

-- Berekening (5) gedaan en toegevoegd
-- Nu (8) berekenen op basis van (5)
INSERT INTO DEC_STAT_DECR 
              ( id_pobj
              , decr_type
              , titel
              , zittingsjaar
              , zittingsjaar_behandeld
              , legislatuur
              , status
              , status_nummer
              , fractie
              , bevoegdheid )
SELECT id_pobj
      , decr_type
      , titel
      , zittingsjaar
      , zittingsjaar_behandeld
      , legislatuur
      , 'NVT' -- Status 'NVT' om zo échte dubbels te vermijden, elke keer filteren op 'NVT' in andere grafieken/tabellen
      , '(8) nog niet afgehandeld op het einde van het zittingsjaar = (5) - (6) - (7)'
      , fractie
      , bevoegdheid
      from dec_Stat_decr
  WHERE id_POBJ in(
  SELECT DISTINCT(id_pobj) 
  FROM dec_stat_decr 
  WHERE status_nummer= '(5) te behandelen of in behandeling = (1)+(2)-(3)-(4)'
    AND zittingsjaar_behandeld = r_zittingsjaren.zittingsjaar
   AND DECR_TYPE in('VOORSTEL VAN RESOLUTIE')
    minus 
      SELECT id_pobj 
      FROM dec_stat_decr 
      WHERE zittingsjaar_behandeld = r_zittingsjaren.zittingsjaar 
      AND DECR_TYPE in('VOORSTEL VAN RESOLUTIE')
      AND status_nummer in( '(6) aangenomen', '(7) verworpen')
       )
AND zittingsjaar_behandeld = r_zittingsjaren.zittingsjaar
   AND DECR_TYPE in('VOORSTEL VAN RESOLUTIE')
  group by id_pobj, decr_type, titel, zittingsjaar, zittingsjaar_behandeld, legislatuur, fractie, bevoegdheid;
  commit;
  -- Resultaat  '(8) nog niet afgehandeld op het einde van het zittingsjaar = (5) - (6) - (7)'
  -- Toegevoegd in tabel met ook status NVT
-- Selecteer mij alle (8) van dit jaar want deze zijn (1) van volgend jaar
INSERT INTO DEC_STAT_DECR 
              ( id_pobj
              , decr_type
              , titel
              , zittingsjaar
              , zittingsjaar_behandeld
              , legislatuur
              , status
              , status_nummer
              , fractie
              , bevoegdheid )
SELECT id_pobj
      , decr_type
      , titel
      , zittingsjaar
      , r_zittingsjaren.c_zj_next -- resultaat van (8) is hetzelfde voor zittingsjaar +1 dus hier gaat men c_zj_next nemen dat het volgende zittingsjaar in de volgorde is
      , legislatuur
      , 'NVT' -- Status 'NVT' om zo échte dubbels te vermijden, elke keer filteren op 'NVT' in andere grafieken/tabellen
      , '(1) nog niet afgehandeld op het einde van het vorige zittingsjaar'
      , fractie
      , bevoegdheid
      FROM dec_stat_decr
WHERE id_POBJ in(
  SELECT id_pobj 
  FROM dec_stat_decr 
  WHERE status_nummer= '(5) te behandelen of in behandeling = (1)+(2)-(3)-(4)'
    AND zittingsjaar_behandeld = r_zittingsjaren.zittingsjaar
    AND DECR_TYPE in('VOORSTEL VAN RESOLUTIE')
    minus 
      SELECT id_pobj 
      FROM dec_stat_decr 
      WHERE zittingsjaar_behandeld = r_zittingsjaren.zittingsjaar 
  AND DECR_TYPE in('VOORSTEL VAN RESOLUTIE')
      AND status_nummer in( '(6) aangenomen', '(7) verworpen')
       )
       AND zittingsjaar_behandeld = r_zittingsjaren.zittingsjaar
  AND DECR_TYPE in('VOORSTEL VAN RESOLUTIE')
  group by id_pobj, decr_type, titel, zittingsjaar, zittingsjaar_behandeld, legislatuur, fractie, bevoegdheid;
  commit;

---------------------------------------------------
-- Totalen berekenen
---------------------------------------------------
INSERT INTO DEC_STAT_DECR 
              ( id_pobj
              , decr_type
              , titel
              , zittingsjaar
              , zittingsjaar_behandeld
              , legislatuur
              , status
              , status_nummer
              , fractie
              , bevoegdheid )
SELECT id_pobj
      , decr_type
      , titel
      , zittingsjaar
      , zittingsjaar_behandeld
      , legislatuur
      , 'totaal resolutie' 
      , 'NVT'
      , fractie
      , bevoegdheid
FROM DEC_STAT_DECR
WHERE id_pobj in(
            SELECT distinct(id_pobj)
            FROM (
              SELECT o_decr.id_pobj
              FROM dec_stat_decr o_decr
              WHERE o_decr.zittingsjaar = r_zittingsjaren.zittingsjaar
              AND o_decr.decr_type = 'VOORSTEL VAN RESOLUTIE'
              AND lower(o_decr.status) = 'ingediend'
              AND  not exists (
                  SELECT o_decr.id_pobj
              FROM dec_stat_decr decr
              WHERE decr.zittingsjaar = r_zittingsjaren.zittingsjaar
              AND decr.decr_type = 'VOORSTEL VAN RESOLUTIE'
              AND decr.id_pobj = o_decr.id_pobj
              AND lower(decr.status) = 'ingetrokken'
                                )
                  )
                )
   AND zittingsjaar = r_zittingsjaren.zittingsjaar
  AND lower(status) in ('ingetrokken', 'ingediend');
  commit;

  -- TOTAAL berekenen
  INSERT INTO DEC_STAT_DECR 
              ( id_pobj
              , decr_type
              , titel
              , zittingsjaar
              , zittingsjaar_behandeld
              , legislatuur
              , status
              , status_nummer
              , fractie
              , bevoegdheid )
SELECT id_pobj
      , 'TOTAAL RESOLUTIE' -- in decreet type omdat het een totaal is dat daaronder komt.
      , titel
      , zittingsjaar
      , zittingsjaar_behandeld
      , legislatuur
      , 'Totaal' -- geen status
      , 'NVT' -- geen statusnummer
      , fractie
      , bevoegdheid
FROM DEC_STAT_DECR
WHERE id_pobj in (
    SELECT id_pobj 
    FROM DEC_STAT_DECR
    WHERE status in ('totaal resolutie' )
      AND zittingsjaar = r_zittingsjaren.zittingsjaar)
AND zittingsjaar =  r_zittingsjaren.zittingsjaar
and status in ('totaal resolutie' );
      commit;


  END LOOP;
  END LOOP;
END;

1 个答案:

答案 0 :(得分:0)

You need to declare your second cursor as a parameterized cursor:

CURSOR c_zittingsjaren(c_lgl core_admin.legislaturen.legislatuur%type) IS
 SELECT  zittingsjaar, lead(zittingsjaar) over (order by zittingsjaar) as c_zj_next
         FROM  core_admin.zittingsjaren zj
        JOIN  core_admin.legislaturen lgl ON (zj.id_lgl = lgl.id)
        WHERE lgl.LEGISLATUUR = c_lgl;

Then in your second FOR loop call c_zittingsjaren passing in the r_legislatuur.c_lgl value from the outer loop:

FOR r_zittingsjaren in c_zittingsjaren(r_legislatuur.c_lgl) LOOP