SQL PL/SQL Verhalten bei Boundary Values

-=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:

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:
Top