SQL PL/SQL Konvertierungsproblem

Skully

Lieutenant
Registriert
Jan. 2002
Beiträge
561
Mein Bruder fragte mich gerade zu einer Lösung des folgenden Problems und ich bin mit PL/SQL nicht so fitt:

Code:
ORA-06502: PL/SQL: numerischer oder Wertefehler: Fehler bei Konvertierung von Hex zu Raw
ORA-06512: in Zeile 11

Neuer Code:
DECLARE
  b LONG raw;
  a VARCHAR2(32760);
  cursor c1 is
    select data
      from xap.ixevpr x
      where x.event_id = 2857402;
BEGIN
  open c1;
loop
    fetch c1 into b;
    exit when c1%notfound;
   a:=sys.utl_raw.cast_to_varchar2(b);
   dbms_output.put(a); 
  end loop;
END;

Hatte an hextoraw usw. gedacht, bin mir aber nicht sicher wie es hier einsetzen kann damit es funktioniert.
Jemand eine Idee?
 
Der Konvertierungsfehler tritt in Zeile 11 auf, in der das Fetch steht. Laut Code wird hier versucht, die Spalte DATA aus der Tabelle xap.ixevpr in eine Variable vom Typ raw zu lesen. Das geht wohl schief, wenn man die Fehlermeldung betrachtet.
Der Code muss abgeändert werden, um dem impliziten Konvertierungsversuch aus dem Weg zu gehen:

Code:
DECLARE
  [COLOR="Red"]c xap.ixevpr.data%type;[/COLOR]
  b LONG raw;
  a VARCHAR2(32760);
  cursor c1 is
    select data
      from xap.ixevpr x
      where x.event_id = 2857402;
BEGIN
  open c1;
loop
    fetch c1 into [COLOR="Red"]c;[/COLOR]
    exit when c1%notfound;
    [COLOR="Red"]b:=hextoraw(c);[/COLOR]
   a:=sys.utl_raw.cast_to_varchar2(b);
   dbms_output.put(a); 
  end loop;
END;

vielleicht reicht auch schon folgendes Konstrukt:

Code:
DECLARE
  b LONG raw;
  a VARCHAR2(32760);
  cursor c1 is
    select [COLOR="Red"]hextoraw([/COLOR]data [COLOR="Red"])[/COLOR]
      from xap.ixevpr x
      where x.event_id = 2857402;
BEGIN
  open c1;
loop
    fetch c1 into b;
    exit when c1%notfound;
   a:=sys.utl_raw.cast_to_varchar2(b);
   dbms_output.put(a); 
  end loop;
END;

Grundsätzlich sollte nochmal der Datentyp von DATA untersucht werden, ob der "Umweg" über raw nötig ist und nicht gleich nach VARCHAR2 möglich ist.
 
Ich denke MistaJack hat da wohl schon die richtige Lösung gegeben. Aber ich möchte auch nochmal seinen letzten Satz betonen. Lieber mal schauen ob man sich das mit dem raw nicht komplett sparen kann!
 
Also dieses Data-Feld ist vom Typ Long, daher der Versuch c1 in b zu bekommen.
Oder würde es schon funktionieren wenn man b gleich als varchar deklariert?
 
Skully schrieb:
Also dieses Data-Feld ist vom Typ Long, daher der Versuch c1 in b zu bekommen.
Oder würde es schon funktionieren wenn man b gleich als varchar deklariert?

Long-Felder sind nicht mehr so richtig up-to-date. Da sollte man lieber CLOB nehmen, was in den aktuelleren Oracle-Versionen bessere Unterstützung erfährt. Eigentlich ist LONG tot und funktioniert nur noch aus Kompatibilitätsgründen.

Wie groß sind denn die Daten in der LONG-Spalte? Bis zur Maximalgröße von Varchar2 kann man das theoretisch direkt konvertieren, sofern nicht Binärdaten im LONG stehen.

Code:
DECLARE
  [COLOR="Red"]c xap.ixevpr.data%type;[/COLOR]
  b LONG raw;
  a VARCHAR2(32760);
  cursor c1 is
    select data
      from xap.ixevpr x
      where x.event_id = 2857402;
BEGIN
  open c1;
loop
    fetch c1 into [COLOR="Red"]c[/COLOR];
    exit when c1%notfound;
    [COLOR="Red"]a:=substr(c,1,255);[/COLOR]
    [COLOR="YellowGreen"]-- dbms_output kann nur 255 Zeichen auf einmal darstellen[/COLOR]
    dbms_output.put(a); 
  end loop;
END;
 
Zurück
Oben