Как заставить функцию CLOBAGG упорядочивать результаты?

У меня есть эта функция clobagg:

create or replace type clobagg_type as object(
  text clob,
  static function ODCIAggregateInitialize(sctx in out clobagg_type
                                         ) return number,
  member function ODCIAggregateIterate(self in out clobagg_type,
                                       value in clob
                                      ) return number,
  member function ODCIAggregateTerminate(self in clobagg_type,
                                         returnvalue out clob,
                                         flags in number
                                        ) return number,
  member function ODCIAggregateMerge(self in out clobagg_type,
                                     ctx2 in clobagg_type
                                    ) return number
);
/
create or replace type body clobagg_type is
  static function ODCIAggregateInitialize(sctx in out clobagg_type
                                         ) return number is
  begin
    sctx := clobagg_type(null);
    return ODCIConst.Success;
  end;
  member function ODCIAggregateIterate(self  in out clobagg_type,
                                       value in     clob
                                      ) return number is
  begin
    self.text := self.text || value;
    return ODCIConst.Success;
  end;
  member function ODCIAggregateTerminate(self in clobagg_type,
                                         returnvalue out clob,
                                         flags in number
                                        ) return number is
  begin
    returnValue := self.text;
    return ODCIConst.Success;
  end;
  member function ODCIAggregateMerge(self in out clobagg_type,
                                     ctx2 in clobagg_type
                                    )return number is
  begin
    self.text := self.text || ctx2.text;
    return ODCIConst.Success;
  end;
end;
/
create or replace function clobagg(input clob) return clob
  deterministic
  parallel_enable
  aggregate using clobagg_type;
/

Но проблема в том, что я получаю данные не в том порядке. Можете ли вы помочь мне и сказать мне, как добиться правильного порядка? Мне нужна функция clobagg, потому что listagg и другие могут возвращать 4000 байт, а в моем случае этого недостаточно.


Вот запрос:

CREATE TABLE GO_PRJ_SACHV7.TEST_STEPS1 (
    test_case_id NUMBER(9,0),
    activity CLOB
);

INSERT INTO GO_PRJ_SACHV7.TEST_STEPS(test_case_id, activity)
  select test_case_id, clobagg(activity1)
  from (
    select 
    testschrit.testfall_id as test_case_id,
    TESTSCHRITT_NR,
    CHR(10) || 'h2.' || TESTSCHRITT_NR || ' ' ||
      CAST(TESTSCHRITT_BEZEICHNUNG AS varchar(800)) || CHR(10) ||
      CAST(TESTSCHRITT_BESCHREIBUNG AS varchar(800)) || CHR(10) ||
      CAST(testschrit.TESTSCHRITT_BESCHREIBUNG AS varchar(800)) ||
      '||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 activity1
    FROM
      GO_PRJ_SACHV7.TESTFALLBESCHREIBUNG tfb,
      GO_PRJ_SACHV7.TESTSCHRITTE testschrit,
      GO_PRJ_SACHV7.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 testschrit.testfall_id, TESTSCHRITT_NR
  )
group by test_case_id;  

Я пытаюсь добавить столбец «активность» в таблицу в правильном порядке. На данный момент я могу добавить это в таблицу, но в случайном порядке. Когда я пытаюсь заказать данные с помощью aktiv.AKTIVITÄT_NR, я также должен добавить это поле в свою группу, и это разрушит мою группировку.


person Greg    schedule 17.12.2013    source источник
comment
Можете ли вы отправить нам свой запрос? Каковы ваши данные? Что вы получаете? Что вы ожидаете?   -  person Colin 't Hart    schedule 17.12.2013
comment
Я пытаюсь добавить столбец активности в таблицу в правильном порядке. На данный момент я могу добавить это в таблицу, но в случайном порядке. Когда я пытаюсь заказать данные с помощью aktiv.AKTIVITÄT_NR, я также должен добавить это поле в свою группу, и это разрушит мою группировку. Извините за многие части этого. Если хотите, я могу отправить вам все запросы по электронной почте.   -  person Greg    schedule 17.12.2013
comment
Вы используете clobagg() дважды в своем запросе; оба производят вывод в порядке, который вам не нравится, или только внешний?   -  person Alex Poole    schedule 17.12.2013
comment
Мне нужен этот clobagg() дважды, и оба они производят вывод в порядке, который мне не нравится.   -  person Greg    schedule 17.12.2013
comment
Если я буду использовать функцию listagg(), которую я буду использовать внутри группы (заказ по aktiv.AKTIVITÄT_NR), и это решит мою проблему, мой результат всегда превышает 4000 байт.... Поэтому я не могу использовать эту функцию.   -  person Greg    schedule 17.12.2013
comment
Я почти уверен, что вам не хватает порядка для внутреннего агрегата. Вам необходимо заказать перед агрегированием. Вы делаете это перед внешней совокупностью, но не перед внутренней.   -  person Colin 't Hart    schedule 17.12.2013


Ответы (1)


Вы пропустили порядок для внутреннего агрегата. Вы должны сделать заказ перед агрегированием. Вы делаете это перед внешней совокупностью, но не перед внутренней.

person Colin 't Hart    schedule 17.12.2013
comment
Можете ли вы объяснить мне, где я должен это сделать? - person Greg; 30.12.2013