sql >> Base de Datos >  >> RDS >> Oracle

tipo de datos REAL en PLSQL

La referencia del lenguaje SQL dice "El tipo de datos REAL es un número de punto flotante con una precisión binaria de 63 o 18 decimal", y se muestra como FLOAT (63). Y FLOAT [(p)] es:

Si crea una tabla con una columna REAL, se comporta como 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

He usado un valor más pequeño para que pueda mostrarse dentro del límite de SQL*Plus/SQL Developer de 49 dígitos para numformat. Observe que los valores FLOAT(126) y NUMBER no son exactamente iguales con ese valor.

PL/SQL es ligeramente diferente. En el paquete estándar puedes ver:

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

En un bloque PL/SQL su REAL variable puede tomar cualquier valor que un NUMBER sin restricciones puede y tiene los mismos efectos de escala/precisión; en este caso solo conservando los (38- 40) dígitos, y redondeando el resto al menor de esos primeros 40 dígitos. El "tamaño" general de su valor, como un número de 72 dígitos, se conserva, pero pierde la precisión más allá de lo que se puede almacenar en el formato interno de Oracle. Si tiene los mismos tipos de variables que el ejemplo de la tabla y coloca sus valores originales en:

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

Observe esta vez que FLOAT y NUMBER sin restricciones muestran el mismo valor, mientras que los FLOAT restringidos tienen la precisión que espera.

Por lo tanto, muestra ceros después del dígito 40 y ese dígito 40 es 5 en lugar de 4 porque excedió la precisión y el valor se redondea a los dígitos más significativos. El tipo de datos SQL REAL tiene una precisión de 63 dígitos binarios o 18 decimales; pero a menos que se especifique un PL/SQL REAL coincide con NÚMERO.