【问题标题】:Oracle Cursor within a cursor游标内的 Oracle 游标
【发布时间】:2015-09-02 05:44:14
【问题描述】:

我有什么:

立法者是 2004-2009 2009-2014

在 2004-2009 年的立法者中,您有“年” 2004年 2004-2005 2005-2006 2006-2007 2008-2009

我想循环让每个立法者拥有每个“年”及其下一个“年” 我一定错过了什么,因为它没有结果。 当我在没有 legislatuurcursor 的情况下运行相同的程序时,它可以完美运行 我只想让它在立法者中运行几年,当去下一个立法者时,它需要从那一年重新开始。

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;

【问题讨论】:

  • Nested Cursors in PL/SQL 的可能重复项
  • 没有第二个光标也能完美运行。我只是希望它为每个立法者都这样做,而不是每年都这样做......

标签: oracle cursor


【解决方案1】:

您需要将第二个游标声明为参数化游标:

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;

然后在您的第二个FOR 循环调用c_zittingsjaren 从外部循环传入r_legislatuur.c_lgl 值:

FOR r_zittingsjaren in c_zittingsjaren(r_legislatuur.c_lgl) LOOP

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 2017-10-31
    • 2018-11-01
    • 1970-01-01
    • 2014-10-01
    • 2014-11-20
    相关资源
    最近更新 更多