我在我的脚本中使用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并且无误地转到下一条记录。
答案 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
这个想法:
select id,lv,sum(length(lv) + 1) over (partition by id) - 1 length_ from src
收集listagg
结果的未来长度,+ 1
为分隔符','
,- 1
为最后一个分隔符完成listagg(case when length_ <= 4000 then lv end,',') within group (order by lv)
检查长度是否小于允许值(4000),如果溢出则返回null 我希望这能解决你的问题。
答案 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
答案 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