Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Kiểu dữ liệu THỰC trong PLSQL

Tham chiếu ngôn ngữ SQL cho biết "Kiểu dữ liệu REAL là một số dấu phẩy động với độ chính xác nhị phân là 63 hoặc 18 thập phân" và nó được hiển thị dưới dạng FLOAT (63). Và FLOAT [(p)] là:

Nếu bạn tạo một bảng với một cột THỰC sẽ hoạt động giống như một 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

Tôi đã sử dụng một giá trị nhỏ hơn để nó có thể được hiển thị trong giới hạn 49 chữ số dành cho Nhà phát triển SQL * Plus / SQL cho numformat. Lưu ý rằng các giá trị FLOAT (126) và NUMBER không hoàn toàn giống nhau với giá trị đó.

PL / SQL hơi khác một chút. Trong gói tiêu chuẩn, bạn có thể thấy:

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

Trong một khối PL / SQL REAL của bạn biến có thể nhận bất kỳ giá trị nào là NUMBER không hạn chế có thể và có cùng tỷ lệ / hiệu ứng chính xác; trong trường hợp này, chỉ bảo tồn (38- 40) và làm tròn số còn lại thành ít nhất trong 40 chữ số đầu tiên đó. 'Kích thước' tổng thể của giá trị của bạn, dưới dạng một số gồm 72 chữ số, được giữ nguyên, nhưng bạn sẽ mất độ chính xác vượt quá những gì có thể được lưu trữ trong định dạng nội bộ của Oracle. Nếu bạn có các loại biến giống như ví dụ bảng và đặt các giá trị ban đầu của bạn vào:

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

Lưu ý lần này rằng FLOAT không hạn chế và NUMBER hiển thị cùng một giá trị, trong khi FLOAT bị hạn chế có độ chính xác như bạn mong đợi.

Vì vậy, nó đang hiển thị các số không sau chữ số thứ 40 và chữ số thứ 40 đó là 5 thay vì 4 vì bạn đã vượt quá độ chính xác và giá trị đang được làm tròn đến các chữ số có nghĩa nhất. Kiểu dữ liệu SQL REAL có độ chính xác là 63 chữ số nhị phân hoặc 18 chữ số thập phân; nhưng trừ khi được chỉ định PL / SQL REAL khớp với NUMBER.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. cách xuất dữ liệu từ bảng nhật ký sang nội dung email trong oracle

  2. Làm rõ trên rownum

  3. Tự động xoay bảng Oracle

  4. Truy vấn trả về:ORA-01427 Truy vấn con một hàng trả về nhiều hơn một hàng

  5. Oracle Tìm kiếm tất cả các bảng tất cả các cột cho chuỗi