sql >> Database >  >> RDS >> Oracle

REAL datatype in PLSQL

De SQL-taalreferentie zegt:"Het gegevenstype REAL is een getal met drijvende komma met een binaire precisie van 63 of 18 decimaal", en wordt weergegeven als FLOAT(63). En FLOAT [(p)] is:

Als u een tabel met een REAL-kolom maakt, gedraagt ​​deze zich als een 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

Ik heb een kleinere waarde gebruikt zodat deze kan worden weergegeven binnen de SQL*Plus/SQL Developer-limiet van 49 cijfers voor numformat. Merk op dat de FLOAT(126) en NUMBER waarden niet helemaal hetzelfde zijn met die waarde.

PL/SQL is iets anders. In het standaardpakket ziet u:

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

In een PL/SQL-blok je REAL variabele kan elke waarde aannemen die een onbeperkt NUMBER kan en heeft dezelfde schaal-/precisie-effecten; in dit geval behoudt alleen de meest significante (38- 40) cijfers, en rond de rest af op het minste van die eerste 40 cijfers. De totale 'grootte' van uw waarde, als een getal van 72 cijfers, blijft behouden, maar u verliest de precisie die verder gaat dan wat kan worden opgeslagen in het interne formaat van Oracle. Als u dezelfde typen variabelen heeft als het tabelvoorbeeld en uw oorspronkelijke waarden invoert 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

Merk deze keer op dat de onbeperkte FLOAT en NUMBER dezelfde waarde tonen, terwijl de beperkte FLOAT's de precisie hebben die u verwacht.

Dus het toont nullen na het 40e cijfer en dat 40e cijfer is 5 in plaats van 4 omdat je de precisie hebt overschreden en de waarde wordt afgerond op de meest significante cijfers. Het gegevenstype SQL REAL heeft een nauwkeurigheid van 63 binaire of 18 decimale cijfers; maar tenzij gespecificeerd, komt een PL/SQL REAL overeen met NUMBER.




  1. Hoe te groeperen op maand in MySQL

  2. ER_ACCESS_DENIED_ERROR:Toegang geweigerd voor gebruiker ''@'localhost' (met wachtwoord:NEE)

  3. MySQL Datum- en Tijdfuncties bestaan ​​niet

  4. Hoe kan ik een diff tussen tabellen versnellen?