Announcement

Collapse
No announcement yet.

utl_raw

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • utl_raw

    Hallo,

    ich will aus einer Datei "fremdländische" Zeichen umwandeln. Bei Recherchen im Internet wie ich das Bewerkstelligen könnte, bin ich auf die oben genannte Funktion gestoßen, die scheinbar das tut, was ich mir vorstelle, ausser ich mache ein Concatenat. Dann verschwindet der 2. Teil?

    Warum, weshalb, Abhilfe, wer kann mir bitte helfen.

    Danke
    Urwi

    Code:
    SELECT utl_raw.cast_to_varchar2(nlssort('1234567890 á ie à â ã æ ç ð é è ê ë í ì î ï ñ ó ò ô Ö õ ø œ š ß ú ù Ü ý ž abcdefghijklmnopqrstuvwxyz ', 'NLS_SORT=BINARY_AI')) ||
           utl_raw.cast_to_varchar2(nlssort('1234567890 á ie à â ã æ ç ð é è ê ë í ì î ï ñ ó ò ô Ö õ ø œ š ß ú ù Ü ý ž abcdefghijklmnopqrstuvwxyz ', 'NLS_SORT=BINARY_AI'))
      FROM dual;

  • #2
    Hast Du Dir mal die Doku angeschaut und die Erläuterungen zum Ausgabetyp? An den Daten ändert sich gar nichts. Aber sie leben nun im Zeichensatz Kontext des Systems bzw. der aktuellen Sitzung.
    Das kann je nach DB single byte, dual byte, multibyte sein.
    Ich schätze da liegt der Hase im Pfeffer. Kann sein, dass der concat operator sich schlicht verrechnet bzw. von nicht gültigen Zeichen/Byte Längen ausgeht.

    doku:
    .. into a value of data type VARCHAR2 with the same number of data bytes. The result is treated as if it were composed of single 8-bit bytes, not characters. Multibyte character boundaries are ignored. The data is not modified in any way, it is only changed to data type VARCHAR2
    Gruß, defo

    Comment


    • #3
      Hallo Defo,

      in der Doku habe ich nichts dazu gefunden! Ich "missbrauche" ja hier eine RAW-Funktion. Wie du richtig zitierst, sollte die Ausgabe VarChar sein. Wenn dem so ist, sollte das kein Grund für das Verhalten sein. Sofern man die Funktion nur 1x verwendet paßt es ja.

      Ich verwende die 11g.

      Danke
      Urwi

      Comment


      • #4
        Originally posted by Urwi View Post
        Hallo Defo,
        in der Doku habe ich nichts dazu gefunden! Ich "missbrauche" ja hier eine RAW-Funktion. Wie du richtig zitierst, sollte die Ausgabe VarChar sein. Wenn dem so ist, sollte das kein Grund für das Verhalten sein. Sofern man die Funktion nur 1x verwendet paßt es ja.
        Also abgesehen davon, dass "sauber" nur der erste Teil zurückgeliefert wird, wage ich zu bezweifeln, dass das in beliebigen NLS / Charset Umgebungen "funktioniert".
        Aber da nur exakt der erste Teil zurückgeliefert wird, hab ich das mal nachgeschaut und folgendes festgestellt:
        1. Die Länge des Concat Ausdrucks wird richtig zurückgegeben, nur der Inhalt felt
        2. Das Verhalten ist unabhängig vom Inhalt.
        3. Die Ausgabe von nlssort mit binary sort produziert am Ende des Rückgabewertes ein '00'
        4. 00 wird von concat offenbar in einen NullChar oder sowas umgesetzt, was dann textende bedeutet.
        5. ein substr(nlssort_expr, 1, length(nlssort_expr)-2 hilft

        Vielleicht findest Du aber auch noch eine richtige Konvertierungsfunktion.


        P.S.:

        z.B.
        Code:
        SELECT CONVERT('Ä Ê Í Õ Ø A B C D E ', 'US7ASCII', 'WE8ISO8859P1') 
           FROM DUAL;
        Zuletzt editiert von defo; 22.05.2014, 12:53.
        Gruß, defo

        Comment


        • #5
          Hallo Defo,

          Danke für Deine Mühe!

          Ich habe das SubStr. probiert. Das || funktioniert, allerdings kommen dann 2 Zeichen zu wenig zurück.

          Convert habe ich auch schon in Betracht gezogen, allerdings kommen bei einigen Zeichen ? zurück (zumindest bei den Kombinationen die etwas Sinnvolles zurückliefern).

          Inzwischen habe ich es mit einem Translate gelöst.

          vg
          Urwi

          Comment

          Working...
          X