-=Renegade=-
Lt. Junior Grade
- Dabei seit
- Nov. 2006
- Beiträge
- 427
Hallo,
Mir ist gerade ein sehr merkwürdiges Verhalten bei Oracle PL/SQL aufgefallen, für das ich so direkt keine logische Antwort habe, aber vielleicht kann mir ja jemand helfen.
Ich experimentiere gerade mit Grenzwerten, insbesondere beim INTEGER (NUMBER). Was mir dabei aufgefallen ist, das ein zulanger Eingabeparameter bei einer Prozedur keinen VALUE_ERROR (06502) auslöst, sondern lediglich die zulangen Werte mit Nullen aufgefüllt werden. Auch wenn ich diesen Übergabeparemeter auf einen Prozedurinternen Integer kopiere, passiert nichts, erst, wenn ich damit beginne, mathematische Operationen darauf auszuführen, wird der 06502 Fehler aktiv.
Ein kleines Beispiel dazu:
Der Aufruf von T_INTEGER(11111222223333344444555556666677777888889999912345, vResult); liefert folgendes Ergebnis:
Input: 11111222223333344444555556666677777888890000000000
CopyInt: 11111222223333344444555556666677777888890000000000
Output: 111112222233333444445555566667
Ändere ich das Kommentar bei der vRes Berechnung und ziehe stattdessen -1 ab, wird der VALUE_ERROR 6502 geworfen.
Ich muss gestehen dass ich dieses Verhalten unlogisch finde, da meiner Meinung nach dies eine Möglichkeit von Berechnungsfehlern bei großen Zahlen liefert, zudem kann ich so einen zulangen Eingabewert nicht mit Hilfe einer Exception abfangen.
Gibt es für dieses Verhalten eine Erklärung?
Vielen Dank im Voraus
so long
Renegade
Mir ist gerade ein sehr merkwürdiges Verhalten bei Oracle PL/SQL aufgefallen, für das ich so direkt keine logische Antwort habe, aber vielleicht kann mir ja jemand helfen.
Ich experimentiere gerade mit Grenzwerten, insbesondere beim INTEGER (NUMBER). Was mir dabei aufgefallen ist, das ein zulanger Eingabeparameter bei einer Prozedur keinen VALUE_ERROR (06502) auslöst, sondern lediglich die zulangen Werte mit Nullen aufgefüllt werden. Auch wenn ich diesen Übergabeparemeter auf einen Prozedurinternen Integer kopiere, passiert nichts, erst, wenn ich damit beginne, mathematische Operationen darauf auszuführen, wird der 06502 Fehler aktiv.
Ein kleines Beispiel dazu:
Code:
PROCEDURE T_INTEGER(vInt IN INTEGER, vRes OUT INTEGER)
IS
vCopyInt INTEGER := NULL;
BEGIN
dbms_output.put_line('Input: ' || vInt);
vCopyInt := vInt;
dbms_output.put_line('CopyInt: ' || vCopyInt);
vRes := vCopyInt / 100000000000000000000;
--vRes := vCopyInt - 1;
dbms_output.put_line('Output: ' || vRes);
END T_INTEGER;
Der Aufruf von T_INTEGER(11111222223333344444555556666677777888889999912345, vResult); liefert folgendes Ergebnis:
Input: 11111222223333344444555556666677777888890000000000
CopyInt: 11111222223333344444555556666677777888890000000000
Output: 111112222233333444445555566667
Ändere ich das Kommentar bei der vRes Berechnung und ziehe stattdessen -1 ab, wird der VALUE_ERROR 6502 geworfen.
Ich muss gestehen dass ich dieses Verhalten unlogisch finde, da meiner Meinung nach dies eine Möglichkeit von Berechnungsfehlern bei großen Zahlen liefert, zudem kann ich so einen zulangen Eingabewert nicht mit Hilfe einer Exception abfangen.
Gibt es für dieses Verhalten eine Erklärung?
Vielen Dank im Voraus
so long
Renegade
Zuletzt bearbeitet: