Bagaimana cara membuat fungsi CLOBAGG mengurutkan hasilnya?

Saya memiliki fungsi clobagg ini:

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

Namun masalahnya adalah saya mendapatkan data yang tidak dalam urutan yang benar. Bisakah Anda membantu saya dan memberi tahu saya cara mencapai urutan yang benar? Saya memerlukan fungsi clobagg karena listagg dan lainnya dapat mengembalikan 4000 byte dan dalam kasus saya itu tidak cukup.


Inilah pertanyaannya:

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;  

Saya mencoba menambahkan kolom 'aktivitas' ke tabel dalam urutan yang benar. Untuk saat ini saya dapat menambahkan ini ke tabel tetapi dengan urutan acak. Ketika saya mencoba memesan data dengan aktiv.AKTIVITÄT_NR Saya juga harus menambahkan bidang ini ke grup saya dan ini menghancurkan pengelompokan saya.


person Greg    schedule 17.12.2013    source sumber
comment
Bisakah Anda mengirimkan pertanyaan Anda kepada kami? Apa datamu? Apa yang kamu dapatkan? Apa yang kamu harapkan?   -  person Colin 't Hart    schedule 17.12.2013
comment
Saya mencoba menambahkan kolom aktivitas ke tabel dalam urutan yang benar. Untuk saat ini saya dapat menambahkan ini ke tabel tetapi dengan urutan acak. Ketika saya mencoba memesan data dengan aktiv.AKTIVITÄT_NR Saya juga harus menambahkan bidang ini ke grup saya dan ini menghancurkan pengelompokan saya. Maaf untuk banyak bagian ini. Jika Anda mau, saya dapat mengirimkan semua pertanyaan melalui email   -  person Greg    schedule 17.12.2013
comment
Anda menggunakan clobagg() dua kali dalam kueri Anda; apakah keduanya menghasilkan keluaran dalam urutan yang tidak Anda sukai, atau hanya urutan luarnya?   -  person Alex Poole    schedule 17.12.2013
comment
Saya memerlukan clobagg() ini dua kali dan keduanya menghasilkan keluaran dalam urutan yang tidak saya sukai   -  person Greg    schedule 17.12.2013
comment
Jika saya akan menggunakan fungsi listagg() yang akan saya gunakan dalam grup (dipesan berdasarkan aktiv.AKTIVITÄT_NR) dan ini menyelesaikan masalah saya, hasil saya selalu melebihi 4000bytes.... Jadi saya tidak dapat menggunakan fungsi ini   -  person Greg    schedule 17.12.2013
comment
Saya cukup yakin Anda melewatkan pesanan untuk agregat bagian dalam. Anda perlu memesan sebelum menggabungkan. Anda melakukan itu sebelum kelompok unsur luar tetapi tidak kelompok unsur dalam.   -  person Colin 't Hart    schedule 17.12.2013


Jawaban (1)


Anda melewatkan pesanan untuk agregat bagian dalam. Anda perlu memesan sebelum mengumpulkan. Anda melakukan itu sebelum kelompok unsur luar tetapi tidak kelompok unsur dalam.

person Colin 't Hart    schedule 17.12.2013
comment
Bisakah Anda menjelaskan di mana saya harus melakukan ini? - person Greg; 30.12.2013