2013-12-20 53 views
3

我使用LISTAGG例外在我的劇本如何處理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,然後轉到下一條記錄。

+1

爲什麼不能夠你SUBSTR()插入串使其小於或EQ。到4000? – Art

+0

你是什麼意思?你能舉個例子嗎? E.x我有一個包含12000字節的字符串。你能寫出它應該是什麼樣子?以獲得最終結果,其中將包含所有12000字節在最後順序排列 – Greg

+0

沒有辦法像11g那樣做。 12000> varchar2 maximum(4000中的<= 11g) =>中它不適用於varchar2;您可以嘗試使用CLOB,但listagg只返回varchar2 =>不然,或者使用12g將varchar2的最大大小增加到32767,這隻會移動限制但是並沒有刪除它 – smnbbrv

回答

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是用於delimeter ','- 1針對未使用
  3. 表達listagg(case when length_ <= 4000 then lv end,',') within group (order by lv)檢查長度小於允許值(4000)的最後一個分隔符做,如果溢出返回null

我希望這能解決你的問題。

+0

感謝您的幫助Simon。說實話,我沒有完全理解您的代碼。1.level <= 10000和level <= 10和level <= 5代表什麼?
2. dual表格?我應該在這裏使用我自己的表格還是雙表格?
3.我可以向您發送我的查詢,並且您會看到我做錯了什麼嗎?
先謝謝您 – Greg

+0

您好,** 1 **即將生成數據se ts從1到10000,1到10和1到5.首先應該溢出varchar2最大長度(4000),其他兩個不會。 ** 2 **雙表是具有一行的系統表,請參閱http://en.wikipedia.org/wiki/DUAL_table瞭解更多信息。在任何代碼中使用它都很常見,我認爲它在每個Oracle DB中都有介紹。 ** 3 **是的,當然,發送它,但我不知道在這裏做的方式...只需附加到您的問題,只留下不起作用的重要部分,並更改名稱更私密。有時當你這樣做,它解決了這個問題:) – smnbbrv

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

+0

幾乎我的答案的副本... – smnbbrv

+1

@Simon對不起,我沒有看到你的答案。現在我看到這個想法是一樣的,但我的答案並不是你答案的確切副本。所以,+1你的答案。 – valex

+0

沒有問題,有時會發生:)反正主線是相同的,我認爲這不是一個解決方案,而不是顯示空值而不是溢出值。它應該以某種方式被截斷,我所看到的唯一想法是創建一個自己的分析函數......但是這會失去排序的可能性。所以,唯一的方法可能是在PL/SQL塊中完成 – smnbbrv

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