如何处理listagg()函数中的异常

时间:2013-12-20 12:55:01

标签: sql oracle grouping

我在我的脚本中使用listagg

listagg(' |' || aktiv.AKTIVITÄT_NR || ' |' || aktiv.AKTIVITÄT_KÜRZEL  || ' |' || aktiv.AKTIVITÄT_BESCHREIBUNG || ' |' || aktiv.AKTIVITÄT_ERWARTETES_ERGEBNIS|| ' |' ||  CHR(10)) within group (order by aktiv.AKTIVITÄT_NR)) as activity 

当listagg超过4000字节时,所有脚本都会失败。如何处理异常并为此记录插入e.x. NULL并且无误地转到下一条记录。

3 个答案:

答案 0 :(得分:2)

抱歉,我用自己的例子来表达这个想法,因为我没有德国版面和你的桌子:

with src as (/* overflow */
             select 1 id, level lv
             from dual
             connect by level <= 10000
             union all
             /* fitting */
             select 2, level lv
             from dual
             connect by level <= 10
             union all
             select 3, level lv
             from dual
             connect by level <= 5)
select listagg(case when length_ <= 4000 then lv end,',') within group (order by lv)
from (select id,lv,sum(length(lv) + 1) over (partition by id) - 1 length_ from src)
group by id

这个想法:

  1. src是你的表,id是你要分组的值,level是你的值
  2. 此子查询select id,lv,sum(length(lv) + 1) over (partition by id) - 1 length_ from src收集listagg结果的未来长度,+ 1为分隔符','- 1为最后一个分隔符完成
  3. expression listagg(case when length_ <= 4000 then lv end,',') within group (order by lv)检查长度是否小于允许值(4000),如果溢出则返回null
  4. 我希望这能解决你的问题。

答案 1 :(得分:1)

我认为你应该计算每个组的字符串长度的和。然后使用CASE来处理该总长度是否> 4000.在以下查询中,我为每个组加入原始表和一个带有SUM(LENGTH)的表。试试这个:

select t.id,
       CASE WHEN (TL.SumLen<=4000)
              THEN LISTAGG(t.Str,',') 
                   WITHIN GROUP (ORDER BY Str)
                          OVER (PARTITION BY t.ID)
            ELSE NULL
       END
FROM t 
JOIN 
(
  SELECT Id, SUM(LENGTH(str||',')) SumLen
         FROM t 
         GROUP BY ID
 ) TL on T.id=TL.id

SQLFiddle demo

答案 2 :(得分:0)

@Simon:这是代码

 drop table  Project.Iterations;
    drop table  Project.test_steps;
    CREATE TABLE Project.TEST_STEPS
    (
    test_case_id NUMBER(9,0),
    test_step varchar2(4000)

    );

    CREATE TABLE Project.TEST_CASES_WITHOUT_TEST_STEPS
    (
    test_case_id NUMBER(9,0)

    );

    INSERT INTO Project.TEST_STEPS(test_case_id,test_step)
    select test_case_id ,
    listagg(activity, chr(10)) within group (order by header1 ) as test_step

    from(
    select 
    testschrit.testfall_id as test_case_id,

     'h2.' || TESTSCHRITT_NR || ' ' || CAST(TESTSCHRITT_BEZEICHNUNG AS varchar(600))  || CHR(10)  || CAST(TESTSCHRITT_BESCHREIBUNG AS varchar(600)) as header1,



    ('h2.' || TESTSCHRITT_NR || ' ' || CAST(TESTSCHRITT_BEZEICHNUNG AS varchar(600))  || CHR(10)  || CAST(TESTSCHRITT_BESCHREIBUNG AS varchar(600)) 
    || '||AKTIVITÄT_NR' || '||AKTIVITÄT_KÜRZEL' || '||AKTIVITÄT_BESCHREIBUNG' || '||AKTIVITÄT_ERWARTETES_ERGEBNIS||' ||  CHR(10)  
    /*|| clobagg(' |' || aktiv.AKTIVITÄT_NR || ' |' || aktiv.AKTIVITÄT_KÜRZEL || ' |' || aktiv.AKTIVITÄT_BESCHREIBUNG || ' |' || aktiv.AKTIVITÄT_ERWARTETES_ERGEBNIS|| ' |' ||  CHR(10))  as activity*/
    || listagg(' |' || aktiv.AKTIVITÄT_NR || ' |' || aktiv.AKTIVITÄT_KÜRZEL  || ' |' || aktiv.AKTIVITÄT_BESCHREIBUNG || ' |' || aktiv.AKTIVITÄT_ERWARTETES_ERGEBNIS|| ' |' ||  CHR(10)) within group (order by aktiv.AKTIVITÄT_NR)) as activity  





    FROM Project.TESTFALLBESCHREIBUNG tfb, Project.TESTSCHRITTE testschrit, Project.AKTIVITÄTEN aktiv
    WHERE testschrit.testfall_id = tfb.testfall_id(+)
    AND  testschrit.TESTSCHRITT_ID=aktiv.TESTSCHRITT_ID (+)



    Group by 
    testschrit.testfall_id,
    testschrit.testschritt_id,
    testschrit.TESTSCHRITT_NR,
    CAST(TESTSCHRITT_BEZEICHNUNG AS varchar(600)),
    CAST(TESTSCHRITT_BESCHREIBUNG AS varchar(600))

    order by test_case_id,
    testschrit.testschritt_nr



    )

    group by test_case_id;

    CREATE TABLE Project.ITERATIONS
    (
    Issue_Id NUMBER(9,0),
    iteration_id NUMBER(9,0),
    content_of_iteration VARCHAR2(4000),
    parent_id NUMBER(9,0),
    Issue_type VARCHAR2(300),
    Hierarchy1 VARCHAR2(300),
    Hierarchy2 VARCHAR2(300),
    summary_name VARCHAR2(300),
    part_elements VARCHAR2(300),
    status VARCHAR2(300),
    issue_category VARCHAR2(300),
    relevance VARCHAR2(300),
    planned_duration FLOAT,
    description VARCHAR2(4000),
    precondition VARCHAR2(300),
    priority NUMBER(3,0),
    assignee VARCHAR2(300),
    expected_result VARCHAR2(300),
    editor VARCHAR2(300),
    modification_date DATE,
    dok_ref VARCHAR2(4000),
    activity VARCHAR2(4000),
    ITERATIONSPARAMETER_NR NUMBER(9,0)
    );


    INSERT INTO Project.ITERATIONS
     select 
      NULL as Issue_Id,
      iter.testfall_id as iteration_id,  
    iter.testfall_id  || ' ' || iter.ITERATIONSPARAMETER || ' ' || iter.ITERATIONSPARAMETER_BESCHREIBU as content_of_iteration,
    tfb.TESTFALL_ID as parent_id,

      'Iteration' as Issue_type,
      NULL as Hierarchy1,
      NULL as Hierarchy2, 
      'Iteration' ||' '|| iter.ITERATIONSPARAMETER_NR  || ' - ' || tfb.FALL_BEZEICHNUNG  as summary_name,
      NULL as part_elements,
      NULL as status,



          NULL as issue_category,

          NULL as relevance,

       /*  CASE (iter.ITERATIONSPARAMETER_NR) WHEN 0 THEN iter.ITERATIONSPARAMETER
         ELSE '' 
         END
         as naglowek,*/

      NULL as planned_duration,

     ' |' || Replace(iter.ITERATIONSPARAMETER,';','|') || ' | |'  ||iter.ITERATIONSPARAMETER_BESCHREIBU || ' |' as description,
      NULL as precondition,
      NULL as priority,
      NULL as assignee,
      NULL as expected_result,
      NULL as editor,
      NULL as modification_date,
      NULL as dok_ref,
     /* NULL as TESTSCHRITT_BEZEICHNUNG*/
    /*NULL as activity*/
    NULL  as activity,
    iter.ITERATIONSPARAMETER_NR as ITERATIONSPARAMETER_NR

    FROM Project.TESTFALLBESCHREIBUNG tfb, Project.ITERATIONSPARAMETER iter

    where 
    iter.testfall_id =tfb.testfall_id (+)
    order by
    Issue_Id,
    iteration_id,
    iter.ITERATIONSPARAMETER_NR ;


    SELECT 
    distinct tfb.TESTFALL_ID as Issue_Id,
    NULL as iteration_id,  
    NULL as content_of_iteration,
    NULL as parent_id,
      'Test_case' as Issue_type,
      REPLACE(globale.testbezeichnung, ' ','_') as Hierarchy1,
      REPLACE(voraus.voraussetzungs_bezeichnung,' ' , '_') as Hierarchy2, 
      CAST(FALL_BEZEICHNUNG AS varchar(150)) as summary_name,
      CAST(BETEILIGTE_ELEMENTE AS varchar(100)) as part_elements,
      status.testfall_status_beschreibung as status,



          (CASE FEHLERFREIHEIT || ' ' || WIDERSPRUCHSLOSIGKEIT || ' ' || VOLLSTÄNDIGKEIT WHEN '0 0 0' THEN ''
        ELSE '' END) ||
         (CASE FEHLERFREIHEIT || ' ' || WIDERSPRUCHSLOSIGKEIT || ' ' || VOLLSTÄNDIGKEIT WHEN '-1 0 0' THEN 'FEHLERFREIHEIT'
        ELSE '' END) ||
         (CASE FEHLERFREIHEIT || ' ' || WIDERSPRUCHSLOSIGKEIT || ' ' || VOLLSTÄNDIGKEIT WHEN '-1 -1 0' THEN 'FEHLERFREIHEIT WIDERSPRUCHSLOSIGKEIT'
        ELSE '' END) ||
        (CASE FEHLERFREIHEIT || ' ' || WIDERSPRUCHSLOSIGKEIT || ' ' || VOLLSTÄNDIGKEIT WHEN '-1 -1 -1' THEN 'FEHLERFREIHEIT WIDERSPRUCHSLOSIGKEIT VOLLSTÄNDIGKEIT'
        ELSE '' END) ||
        (CASE FEHLERFREIHEIT || ' ' || WIDERSPRUCHSLOSIGKEIT || ' ' || VOLLSTÄNDIGKEIT WHEN '0 -1 0' THEN 'WIDERSPRUCHSLOSIGKEIT'
        ELSE '' END) ||
        (CASE FEHLERFREIHEIT || ' ' || WIDERSPRUCHSLOSIGKEIT || ' ' || VOLLSTÄNDIGKEIT WHEN '0 -1 -1' THEN 'WIDERSPRUCHSLOSIGKEIT VOLLSTÄNDIGKEIT'
        ELSE '' END)||
        (CASE FEHLERFREIHEIT || ' ' || WIDERSPRUCHSLOSIGKEIT || ' ' || VOLLSTÄNDIGKEIT WHEN '-1 0 -1' THEN 'FEHLERFREIHEIT VOLLSTÄNDIGKEIT'
        ELSE '' END) ||
        (CASE FEHLERFREIHEIT || ' ' || WIDERSPRUCHSLOSIGKEIT || ' ' || VOLLSTÄNDIGKEIT WHEN '0 0 -1' THEN 'VOLLSTÄNDIGKEIT'
        ELSE '' END) as issue_category,

         (CASE ELEMENTTEST || ' ' || INTEGRATIONSTEST || ' ' || SYSTEMTEST WHEN '0 0 0' THEN ''
        ELSE '' END) ||
         (CASE ELEMENTTEST || ' ' || INTEGRATIONSTEST || ' ' || SYSTEMTEST WHEN '-1 0 0' THEN 'ELEMENTTEST'
        ELSE '' END) ||
         (CASE ELEMENTTEST || ' ' || INTEGRATIONSTEST || ' ' || SYSTEMTEST WHEN '-1 -1 0' THEN 'ELEMENTTEST INTEGRATIONSTEST'
        ELSE '' END) ||
        (CASE ELEMENTTEST || ' ' || INTEGRATIONSTEST || ' ' || SYSTEMTEST WHEN '-1 -1 -1' THEN 'ELEMENTTEST INTEGRATIONSTEST SYSTEMTEST'
        ELSE '' END) ||
        (CASE ELEMENTTEST || ' ' || INTEGRATIONSTEST || ' ' || SYSTEMTEST WHEN '0 -1 0' THEN 'INTEGRATIONSTEST'
        ELSE '' END) ||
        (CASE ELEMENTTEST || ' ' || INTEGRATIONSTEST || ' ' || SYSTEMTEST WHEN '0 -1 -1' THEN 'INTEGRATIONSTEST SYSTEMTEST'
        ELSE '' END)||
        (CASE ELEMENTTEST || ' ' || INTEGRATIONSTEST || ' ' || SYSTEMTEST WHEN '-1 0 -1' THEN 'ELEMENTTEST SYSTEMTEST'
        ELSE '' END) ||
        (CASE ELEMENTTEST || ' ' || INTEGRATIONSTEST || ' ' || SYSTEMTEST WHEN '0 0 -1' THEN 'SYSTEMTEST'
        ELSE '' END) as relevance,
     /* NULL as head, */

      tfb.GEPLANTER_AUFWAND as planned_duration,
      CAST(BESCHREIBUNG_TESTFALL AS varchar(4000)) as description,
      CAST(AUSGANGSSITUATION AS varchar(200)) as precondition,
      WICHTIGKEIT as priority,
      BEARBEITER as assignee,
      CAST(ERWARTETE_ERGEBNISSE AS varchar(200)) as expected_result,
      LETZTER_BEARBEITER as editor,
      DATUM_LETZTE_ÄNDERUNG as modification_date,
       Replace(LISTAGG( dokref.dokumentenreferenz, chr(10)) within group (order by dokref.dokumentenreferenz),' ','_') as dok_ref,
    steps.test_step as activity,
    NULL as ITERATIONSPARAMETER_NR





    FROM Project.TESTFALLBESCHREIBUNG tfb, Project.TEST_STEPS steps,Project.NM_TESTFALL_DOKUMENTENREFERENZ nmdokref,
    Project.DOKUMENTENREFERENZ dokref, Project.TESTFALL_STATUS status, Project.VORAUSSETZUNGEN voraus, Project.GLOBALE_ANGABEN globale,
    Project.NM_TESTFÄLLE_STICHWORTE stich, Project.STICHWORTE stichworte
    WHERE tfb.testfall_id=steps.test_case_id (+)
    AND tfb.testfall_id= nmdokref.testfall_id (+)
    AND nmdokref.dokumentenreferenz_id= dokref.dokumentenreferenz_id(+)
    AND tfb.testfall_status= status.testfall_status (+)
    AND tfb.voraussetzung_id=voraus.voraussetzung_id (+)
    AND voraus.tz_id= globale.tz_id (+)
    AND tfb.testfall_id= stich.testfall_id (+)
    AND stich.stichworte_id= stichworte.stichwort_id (+)







    GROUP BY  

      tfb.TESTFALL_ID,
      globale.testbezeichnung,
      status.testfall_status_beschreibung,
      voraus.voraussetzungs_bezeichnung,
      CAST(FALL_BEZEICHNUNG AS varchar(200)) ,
      CAST(BETEILIGTE_ELEMENTE AS varchar(200)),
      FEHLERFREIHEIT,
      WIDERSPRUCHSLOSIGKEIT,
      VOLLSTÄNDIGKEIT,
      ELEMENTTEST,
      INTEGRATIONSTEST,
      SYSTEMTEST,
      tfb.GEPLANTER_AUFWAND,
      CAST(BESCHREIBUNG_TESTFALL AS varchar(200)),
      CAST(AUSGANGSSITUATION AS varchar(200)),
      WICHTIGKEIT,
      BEARBEITER,
      CAST(ERWARTETE_ERGEBNISSE AS varchar(200)),
      LETZTER_BEARBEITER,
      DATUM_LETZTE_ÄNDERUNG,
      status.testfall_status_beschreibung,
      stichworte.stichwort,
      steps.test_step






     UNION ALL

    select * from Project.ITERATIONS