sql >> Databáze >  >> RDS >> Oracle

REAL datový typ v PLSQL

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.




  1. Jak vložím post_id do databáze mysql

  2. Jak mohu v CodeIgniter vybrat ze vztahu jeden k mnoha?

  3. Jak získá datum mms z content://mms.

  4. Schéma zpětného inženýrství (orákula) k ERD