Oracle
 sql >> Baza danych >  >> RDS >> Oracle

PRAWDZIWY typ danych w PLSQL

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle SQL, połącz wiele kolumn + dodaj tekst

  2. Użyj aliasu tabeli w innym zapytaniu, aby przejść przez drzewo

  3. tworzenie skryptu SQL

  4. Zapytanie Oracle SQL - pobierz dane z ostatniego tygodnia (poniedziałek-sobota)

  5. Jak mogę zabić wszystkie sesje łączące się z moją bazą danych Oracle?