Главная > SQL > Агрегатная функция stragg — складывает строки


Агрегатная функция stragg — складывает строки

Скрипт создания функции

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;
/

Пример использования

with t as
( select 'a1' val from dual
union all
  select 'b2' val from dual
)
select stragg(val) as val from t;

val
---------------------------
a1,b2

Похожие записи:

  1. 26 Апрель 2012 в 12:15 | #1

    Есть этому аналог в десятке:

    with t as
    ( select 'a1' val from dual
    union all
      select 'b2' val from dual
    )
    select wmsys.wm_concat(t.val) from t
    
  2. profik
    8 Январь 2013 в 13:49 | #2

    ulandj :
    Есть этому аналог в десятке:

    в 11-ке уже не работает

  3. 9 Январь 2013 в 11:51 | #3

    Данный пост показывает как именно самому можно сделать функцию. Естественно, есть другие способы использующие стандартные процедуры. Например listagg

  4. Rovshan
    12 Июль 2013 в 10:59 | #4
  1. Пока что нет уведомлений.