Oracle
 sql >> Datenbank >  >> RDS >> Oracle

REAL-Datentyp in PLSQL

Die SQL-Sprachreferenz sagt "Der REAL-Datentyp ist eine Gleitkommazahl mit einer binären Genauigkeit von 63 oder 18 Dezimalstellen" und wird als FLOAT (63) angezeigt. Und FLOAT [(p)] ist:

Wenn Sie eine Tabelle mit einer REAL-Spalte erstellen, verhält sie sich wie ein FLOAT(63):

create table t42 (a real, b float(126), c float(63), d number);
insert into t42 (a, b, c, d)
values (123456789123456789123456789123456789123456789123456,
  123456789123456789123456789123456789123456789123456,
  123456789123456789123456789123456789123456789123456,
  123456789123456789123456789123456789123456789123456);

select a, b, c, d from t42;

                                                               A
----------------------------------------------------------------
                                                               B
----------------------------------------------------------------
                                                               C
----------------------------------------------------------------
                                                               D
----------------------------------------------------------------
             123456789123456789100000000000000000000000000000000 
             123456789123456789123456789123456789120000000000000 
             123456789123456789100000000000000000000000000000000 
             123456789123456789123456789123456789123000000000000

Ich habe einen kleineren Wert verwendet, damit er innerhalb der SQL*Plus/SQL Developer-Grenze von 49 Ziffern für numformat angezeigt werden kann. Beachten Sie, dass die Werte FLOAT(126) und NUMBER nicht ganz mit diesem Wert übereinstimmen.

PL/SQL ist etwas anders. Im Standardpaket sehen Sie:

  type NUMBER is NUMBER_BASE;
  subtype FLOAT is NUMBER; -- NUMBER(126)
  subtype REAL is FLOAT; -- FLOAT(63)

In einem PL/SQL-Block Ihr REAL Variable kann jeden Wert annehmen, der eine uneingeschränkte NUMBER ist kann und hat die gleichen Skalierungs-/Präzisionseffekte; in diesem Fall werden nur die wichtigsten (38- 40) Stellen und Runden des Rests auf die kleinste der ersten 40 Stellen. Die Gesamtgröße Ihres Werts als 72-stellige Zahl bleibt erhalten, aber Sie verlieren die Genauigkeit, die über das hinausgeht, was im internen Format von Oracle gespeichert werden kann. Wenn Sie die gleichen Variablentypen wie im Tabellenbeispiel haben und Ihre ursprünglichen Werte einfügen in:

DECLARE
  A REAL := 123456789123456789123456789123456789123456789123456789123456789123456789;
  B FLOAT(126) := 123456789123456789123456789123456789123456789123456789123456789123456789;
  c FLOAT(63) := 123456789123456789123456789123456789123456789123456789123456789123456789;
  D NUMBER := 123456789123456789123456789123456789123456789123456789123456789123456789;
BEGIN
  DBMS_OUTPUT.PUT_LINE('A Value is : ' || A);
  DBMS_OUTPUT.PUT_LINE('B Value is : ' || B);
  DBMS_OUTPUT.PUT_LINE('C Value is : ' || C);
  DBMS_OUTPUT.PUT_LINE('D Value is : ' || D);
END;
/

A Value is : 123456789123456789123456789123456789123500000000000000000000000000000000
B Value is : 123456789123456789123456789123456789120000000000000000000000000000000000
C Value is : 123456789123456789100000000000000000000000000000000000000000000000000000
D Value is : 123456789123456789123456789123456789123500000000000000000000000000000000

Beachten Sie diesmal, dass die uneingeschränkten FLOATs und NUMBER den gleichen Wert zeigen, während die eingeschränkten FLOATs die erwartete Genauigkeit haben.

Es werden also Nullen nach der 40. Ziffer angezeigt, und diese 40. Ziffer ist 5 statt 4, da Sie die Genauigkeit überschritten haben und der Wert auf die signifikantesten Ziffern gerundet wird. Der Datentyp SQL REAL hat eine Genauigkeit von 63 Binär- oder 18 Dezimalstellen; aber sofern nicht anders angegeben, stimmt ein PL/SQL-REAL mit NUMBER überein.