Informacje o języku SQL mówi „Typ danych REAL to liczba zmiennoprzecinkowa z dokładnością binarną 63 lub 18 miejsc po przecinku” i jest wyświetlany jako FLOAT(63). A FLOAT [(p)] to:
Jeśli tworzysz tabelę z kolumną REAL, zachowuje się ona jak 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
Użyłem mniejszej wartości, aby mogła być wyświetlana w limicie SQL*Plus/SQL Developer wynoszącym 49 cyfr dla numformat. Zauważ, że wartości FLOAT(126) i NUMBER nie są dokładnie takie same jak ta wartość.
PL/SQL jest nieco inny. W standardowym pakiecie możesz zobaczyć:
type NUMBER is NUMBER_BASE;
subtype FLOAT is NUMBER; -- NUMBER(126)
subtype REAL is FLOAT; -- FLOAT(63)
W bloku PL/SQL Twój REAL
zmienna może przyjmować dowolną wartość, której nieograniczony NUMBER
może i ma taki sam efekt skali/precyzji; w tym przypadku zachowywanie tylko najważniejszych (38- 40)
cyfry i zaokrąglając resztę do najmniejszej z tych pierwszych 40 cyfr. Całkowity „rozmiar” Twojej wartości, jako 72-cyfrowej liczby, jest zachowywany, ale tracisz precyzję wykraczającą poza to, co można zapisać w wewnętrznym formacie Oracle. Jeśli masz takie same typy zmiennych jak w przykładzie w tabeli i umieść oryginalne wartości w:
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
Zauważ, że tym razem nieograniczone wartości FLOAT i NUMBER pokazują tę samą wartość, podczas gdy ograniczone wartości FLOAT mają oczekiwaną precyzję.
Więc pokazuje zera po czterdziestej cyfrze, a ta czterdziesta cyfra to 5 zamiast 4, ponieważ przekroczyłeś precyzję i wartość jest zaokrąglana do najbardziej znaczących cyfr. Typ danych SQL REAL ma precyzję 63 cyfr binarnych lub 18 cyfr dziesiętnych; ale o ile nie określono, RZECZYWISTE PL/SQL pasuje do LICZBY.