Reference jazyka SQL říká "Datový typ REAL je číslo s plovoucí desetinnou čárkou s binární přesností 63 nebo 18 dekadických", a je zobrazen jako FLOAT(63). A FLOAT [(p)] je:
Pokud vytvoříte tabulku se sloupcem REAL, chová se jako 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
Použil jsem menší hodnotu, takže ji lze zobrazit v rámci limitu SQL*Plus/SQL Developer 49 číslic pro numformat. Všimněte si, že hodnoty FLOAT(126) a NUMBER nejsou s touto hodnotou úplně stejné.
PL/SQL je mírně odlišný. Ve standardním balení vidíte:
type NUMBER is NUMBER_BASE;
subtype FLOAT is NUMBER; -- NUMBER(126)
subtype REAL is FLOAT; -- FLOAT(63)
V bloku PL/SQL vaše REAL
proměnná může mít libovolnou hodnotu, než je neomezené NUMBER
může a má stejné měřítko/přesnost; v tomto případě pouze zachování nejvýznamnějšího (38- 40)
číslic a zbytek zaokrouhlíme na nejmenší z těchto prvních 40 číslic. Celková „velikost“ vaší hodnoty jako 72místného čísla je zachována, ale ztrácíte přesnost, která přesahuje to, co lze uložit v interním formátu Oracle. Pokud máte stejné typy proměnných jako v příkladu tabulky a vložte své původní hodnoty do:
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
Všimněte si tentokrát, že neomezené FLOAT a NUMBER ukazují stejnou hodnotu, zatímco omezené FLOAT mají přesnost, jakou očekáváte.
Po 40. číslici se tedy zobrazují nuly a tato 40. číslice je 5 místo 4, protože jste překročili přesnost a hodnota se zaokrouhluje na nejvýznamnější číslice. Datový typ SQL REAL má přesnost 63 binárních nebo 18 dekadických číslic; ale pokud není uvedeno, PL/SQL REAL odpovídá ČÍSLU.