Re: Аггрегат над стрингами

From
Roman Miroshnichenko (2:5020/400)
To
Roman Miroshnichenko (2:5054/37.63)
Date
2005-04-07T08:49:50Z
Area
RU.RDBMS.ORACLE
From: "Roman Miroshnichenko" <mir@cbsd.donetsk.ua>

On Wed, 6 Apr 2005 11:42:11 +0000 (UTC), Roman Miroshnichenko  
<mir@cbsd.donetsk.ua> wrote:

Добрый день еще раз!
С Великим праздником всех Вас!
> Допустим, есть таблица со значениями
> 01
> 02
> 06
> Как написать запрос, чтобы в результате было '010206'?
> Спасибо.
Я получил несколько ответов. Спасибо Всем за соучастие.
Однако то ли я некорректно изъяснил суть проблемы, то ли меня не поняли,
но мне нужно было решить не частную эту проблему, а как говорят у нас на
Украине "взагалi", то есть мне нужна была функция, работающая в group by,
но умеющая конкатенировать поля varchar

Решение этой проблемы (как и многих других) лежит в чтении документации :)
Пару dml-стейтментов, и функция готова:

create or replace type OBJ_AGG_CONCAT as object
(
   -- Author  : Bill@cbsd.donetsk.ua
   -- Created : 06.04.2005 16:03:18
   -- Purpose : Routines for AGG_CONCAT

   runningSum VARCHAR2(10000),

   static function ODCIAggregateInitialize(value IN OUT OBJ_AGG_CONCAT)
     return number,
   member function ODCIAggregateIterate(self IN OUT OBJ_AGG_CONCAT,
     value IN varchar2) return number,
   member function ODCIAggregateTerminate(self IN OBJ_AGG_CONCAT,  
returnValue
     OUT varchar2, flags IN number) return number,
   member function ODCIAggregateMerge(self IN OUT OBJ_AGG_CONCAT,
     value IN OBJ_AGG_CONCAT) return number
);
/

create or replace type body OBJ_AGG_CONCAT is

static function ODCIAggregateInitialize(value IN OUT OBJ_AGG_CONCAT)
return number is
begin
   value := OBJ_AGG_CONCAT('');
   return ODCIConst.Success;
end;

member function ODCIAggregateIterate(self IN OUT OBJ_AGG_CONCAT, value IN  
varchar2)
return number is
begin
   runningSum := runningSum || value;
   return ODCIConst.Success;
end;

member function ODCIAggregateTerminate(self IN OBJ_AGG_CONCAT, returnValue  
OUT
varchar2, flags IN number) return number is
begin
   returnValue := runningSum;
   return ODCIConst.Success;
end;

member function ODCIAggregateMerge(self IN OUT OBJ_AGG_CONCAT, value IN
OBJ_AGG_CONCAT) return number is
begin
   self.runningSum := self.runningSum || value.runningSum;
   return ODCIConst.Success;
end;

end;
/

CREATE OR REPLACE FUNCTION AGG_CONCAT (input varchar2) RETURN varchar2
     PARALLEL_ENABLE AGGREGATE USING OBJ_AGG_CONCAT;
/

И теперь я просто пишу
select agg_concat(my_field) from my_table
и получаю свои '010206' или же вдругом порядке, что сути не меняет


С ув. Роман

--- ifmail v.2.15dev5.3
 * Origin: CBSD (2:5020/400)
SEEN-BY: 50/203 520 450/159 186 451/30 452/25 454/9 461/33 43 74 106 640
SEEN-BY: 464/34 465/204 469/125 999 550/5068 4623/56 4625/8 9 4626/100 4627/10
SEEN-BY: 4641/444 4646/1 4653/10 4657/50 5000/76 5001/5001 5002/76 5002
SEEN-BY: 5003/34 57 5004/58 5006/1 5007/1 5010/53 70 5011/13 5015/4 28 5020/20
SEEN-BY: 5020/52 104 115 118 128 150 175 194 400 401 545 600 639 642 715 758
SEEN-BY: 5020/794 894 921 968 982 1057 1100 1169 1212 1234 1356 1604 1626 1642
SEEN-BY: 5020/1835 1873 1909 1930 2013 2020 2200 2238 4400 4441 5021/3 44
SEEN-BY: 5022/128 5023/11 5025/19 151 750 5026/14 45 78 5030/69 195 382 920
SEEN-BY: 5030/966 1016 1063 1339 1900 5032/11 16 5033/21 35 5034/8 5035/10
SEEN-BY: 5036/1 13 5037/21 5040/33 47 5041/4 10 5042/13 5045/7 42 5049/157
SEEN-BY: 5050/9 41 5051/15 35 5053/16 5054/1 8 9 28 35 37 45 50 5056/16 5057/1
SEEN-BY: 5058/77 5059/20 5060/88 90 5061/15 5062/1 5063/5 41 51 5064/7 35 36
SEEN-BY: 5066/18 5070/26 66 1222 5071/22 5079/23 49 5080/80 1003 5081/2 5082/6
SEEN-BY: 5083/13 21 5090/23 5093/27 57 5100/113 6000/12 6001/3
PATH: 5020/400 4441 52 5054/1 37