Oracle
 sql >> Datenbank >  >> RDS >> Oracle

ORACLE SQL LISTAGG gibt das erwartete Ergebnis nicht zurück

Dies scheint mit Fehler 19461687 und dieser vorherigen Frage zusammenzuhängen . Wenn Sie den aggregierten Wert aus Ihrer Abfrage in 11gR2 oder 12cR1 ausgeben, sehen Sie:

LISTAGG_OUTPUT
--------------------------------------------------------------------------------------------------
Typ=1 Len=25 CharacterSet=AL32UTF8: 0,41,0,52,0,34,0,30,0,30,0,31,2c,0,41,0,52,0,34,0,30,0,30,0,32

In SQL*Plus und SQL Developer wird der tatsächliche Wert wie folgt angezeigt:

LISTAGG_OUTPUT
----------------------------------------
 A R 4 0 0 1, A R 4 0 0 2

und Sie können den Wert nicht aus SQL Developer kopieren. (In 12cR2 erscheinen die Nullen nicht mehr im Dump, der Wert wird ohne Leerzeichen angezeigt und Sie können ihn kopieren, der Fehler scheint also behoben zu sein.)

Diese Null-Bytes scheinen dazu zu führen, dass Toad den Wert überhaupt nicht anzeigt, vermutlich weil es das erste Null-Byte sieht und es als String-Terminator behandelt (oder so ähnlich).

SQL Fiddle scheint damit fertig zu werden, aber db<>fiddle scheint auch ein Problem damit zu haben und gibt nichts für die gesamte Fiddle zurück, wenn diese Abfrage vorhanden ist.

Sie könnten Ihre Tabellenspalte als varchar2 neu definieren statt nvarchar2 , aber ich nehme an, dass es aus einem bestimmten Grund dieser Datentyp ist, also ist das wahrscheinlich nicht praktikabel.

Sie könnten es also stattdessen als Teil der Abfrage umwandeln:

SELECT LISTAGG(CAST(MOD_CODE AS VARCHAR2(12)),',')
  WITHIN GROUP (ORDER BY MOD_CODE) LISTAGG_OUTPUT
FROM XOTEST_A
WHERE MOD_CODE IN ('AR4001','AR4002');

LISTAGG_OUTPUT
----------------------------------------
AR4001,AR4002

Oder prüfen Sie, ob der Patch für Fehler 19461687 das Problem für Sie behebt.