Announcement

Collapse
No announcement yet.

Varchar-Längenbegrenzung der Ausgabe einer Function

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

  • Varchar-Längenbegrenzung der Ausgabe einer Function

    Hallo, folgendes Problem:<BR>
    <BR>
    folgende Oracle-Function soll einen Varchar2(12) zurückliefern.<BR>
    Nach return varchar2 kann man leider nicht in Klammern die Länge angeben, da gibt es einen Fehler :-(.<BR>

    CREATE OR REPLACE FUNCTION GET_TYP_TEXT(p_typ in number)<BR>
    return varchar2<BR>
    as<BR>
    result varchar2(12);<BR>
    begin<BR>
    result := '';<BR>
    if (p_typ = 1) then result := 'Typ ist EINS'; <BR>
    elsif (p_typ = 2) then result := 'Typ ist ZWEI'; <BR>
    elsif (p_typ = 3) then result := 'Typ ist DREI'; <BR>
    end if;<BR>
    return result;<BR>
    end;<BR>

    Sie wird in einem Select aufgerufen, z.B.<BR>
    <BR>
    Select typ, GET_TYP_TEXT(typ) as TText from MyTable;<BR>
    <BR>
    In diesem Select hat TText aber leider die Länge 4000 und nicht 12.<BR>
    Wie kann ich die Ausgabe-Länge auf 12 begrenzen ?<BR>
    <BR>
    Danke im Voraus<BR>
    Steffen<BR>

  • #2
    morgen steffen,

    versuch es doch einfach mal mit einem
    Substring. Also z.B.
    Select typ, substr(GET_TYP_TEXT(typ), 1, 12) as TText from MyTable;
    habe es zwar selbst noch nicht versucht, aber zur längenbegrenzung fällt mir spontan erst einmal diese funktion ein.

    cu ja

    Comment


    • #3
      Hallo Steffen,

      für Rückgabewerte in PL/SQL-Funktionen werden nur Typen und keine Typlängen vereinbart. Die tatsächlich mögliche Anzahl an Zeichen hängt dann davon ab, mit welcher Länge die Variable im aufrufenden Block deklariert wurde. Ein Konstrukt:<pre>
      declare
      dummy varchar2(2);
      begin
      dummy := GET_TYP_TEXT(3);
      end;</pre>
      wird in jedem Fall auf eine Exception laufen - hier bist du dann als Programmierer gefordert und mußt die Deklaration von dummy anpassen.
      Verwendest du die Funktion dagegen in einem SELECT, dann hast du keinen Einfluss auf den "Empfangspuffer", dieser wird von ORACLE implizit reserviert. Damit dann hier keine Exception wegen Längenüberschreitung auftritt, wird eben der maximale Bereich reserviert und das sind bei einem VARCHAR2 4000 Zeichen. Der gleiche Effekt tritt auch auf, wenn du die Ausgabe (wie von Jan beschrieben) mit einem SUBSTR() einkürzt. Der Returnwert von SUBSTR ist ja ein VARCHAR2 und kein VARCHAR2(12)
      Im Enedeffekt kann dir das doch aber egal sein! Oder?

      Gruß Fal
      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

      Comment

      Working...
      X