1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
| create or replace type string_agg_type as object
(
total varchar2(4000),
static function
ODCIAggregateInitialize(sctx IN OUT string_agg_type )
return number,
member function
ODCIAggregateIterate(self IN OUT string_agg_type ,
value IN varchar2 )
return number,
member function
ODCIAggregateTerminate(self IN string_agg_type,
returnValue OUT varchar2,
flags IN number)
return number,
member function
ODCIAggregateMerge(self IN OUT string_agg_type,
ctx2 IN string_agg_type)
return number
);
/
create or replace type body string_agg_type
is
static function ODCIAggregateInitialize(sctx IN OUT string_agg_type)
return number
is
begin
sctx := string_agg_type( null );
return ODCIConst.Success;
end;
member function ODCIAggregateIterate(self IN OUT string_agg_type,
value IN varchar2 )
return number
is
begin
self.total := self.total || ';' || value;
return ODCIConst.Success;
end;
member function ODCIAggregateTerminate(self IN string_agg_type,
returnValue OUT varchar2,
flags IN number)
return number
is
begin
returnValue := ltrim(self.total,';');
return ODCIConst.Success;
end;
member function ODCIAggregateMerge(self IN OUT string_agg_type,
ctx2 IN string_agg_type)
return number
is
begin
self.total := self.total || ctx2.total;
return ODCIConst.Success;
end;
end;
/
CREATE or replace
FUNCTION stragg(input varchar2 )
RETURN varchar2
PARALLEL_ENABLE AGGREGATE USING string_agg_type;
/
SELECT POINT_ID, stragg(resu_rendu)
FROM (
SELECT point_id AS LABO, FLACO_ID AS FLACON,ETIQ_REPLIQUE AS REP,resu_rendu AS RESULTAT
FROM v_plan1
ORDER BY POINT_ID, FLACO_ID,ETIQ_REPLIQUE ASC)
GROUP BY POINT_id
--Solution 2
CREATE OR REPLACE FUNCTION CONCAT_LIST(cur SYS_REFCURSOR )
RETURN VARCHAR2 IS
ret VARCHAR2(32000);
tmp VARCHAR2(4000);
BEGIN
LOOP
FETCH cur INTO tmp;
EXIT WHEN cur%NOTFOUND;
ret := ret || ';' || tmp;
END LOOP;
RETURN ret;
END CONCAT_LIST;
SELECT POINT_ID, SUBSTR(VALEURS,2,LENGTH(VALEURS))
FROM
(
SELECT POINT_ID,
CONCAT_LIST(CURSOR(
SELECT (CASE
WHEN CHECK_NUMBER(resu_rendu) IS NULL THEN resu_rendu
ELSE CONV_NUMBER_TO_STRING(TO_NUMBER(resu_rendu),2) END)
FROM v_plan1 V2
WHERE V2.POINT_ID=V1.POINT_ID
ORDER BY V2.POINT_ID, V2.FLACO_ID,V2.ETIQ_REPLIQUE ASC
)) VALEURS
FROM V_PLAN1 V1
GROUP BY POINT_ID
ORDER BY POINT_ID ASC) |
Partager