sql >> Database teknologi >  >> RDS >> Oracle

RIGTIG datatype i PLSQL

SQL sprogreference siger "Den RIGTIGE datatype er et flydende decimaltal med en binær præcision på 63 eller 18 decimaler", og det vises som FLOAT(63). Og FLOAT [(p)] er:

Hvis du opretter en tabel med en REAL kolonne, opfører den sig som en 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

Jeg har brugt en mindre værdi, så den kan vises inden for SQL*Plus/SQL-udviklergrænsen på 49 cifre for numformat. Bemærk, at FLOAT(126)- og NUMBER-værdierne ikke er helt de samme med den værdi.

PL/SQL er lidt anderledes. I standardpakken kan du se:

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

I en PL/SQL bloker din REAL variabel kan tage en hvilken som helst værdi end et ubegrænset NUMBER kan og har samme skala/præcisionseffekter; i dette tilfælde kun bevare den mest betydningsfulde (38- 40) cifre, og afrunding af resten til det mindste af de første 40 cifre. Den overordnede 'størrelse' af din værdi, som et 72-cifret tal, bevares, men du mister præcisionen ud over, hvad der kan gemmes i Oracles interne format. Hvis du har de samme variabeltyper som tabeleksemplet og sætter dine oprindelige værdier i:

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

Bemærk denne gang, at den ubegrænsede FLOAT og NUMBER viser den samme værdi, mens de begrænsede FLOAT'er har den præcision, du forventer.

Så det viser nuller efter det 40. ciffer, og det 40. ciffer er 5 i stedet for 4, fordi du har overskredet præcisionen, og værdien afrundes til de mest signifikante cifre. SQL REAL-datatypen har en præcision på 63 binære eller 18 decimale cifre; men medmindre det er angivet, matcher et PL/SQL REAL NUMBER.




  1. Entity Framework genererer short i stedet for int

  2. ROracle installation ::Kan ikke indlæse delt objekt fejl

  3. Hvordan YEARWEEK() fungerer i MariaDB

  4. Opdater værdier fra MYSQL-tabellen uden at genindlæse siden?