sql >> データベース >  >> RDS >> Oracle

PLSQLのREALデータ型

    SQL言語リファレンス 「REALデータ型は、2進精度が63、つまり10進数で18の浮動小数点数です」と表示され、FLOAT(63)として表示されます。そしてFLOAT[(p)]は:

    REAL列を持つテーブルを作成すると、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
    

    numformatのSQL*Plus / SQL Developerの制限である49桁の範囲内で表示できるように、小さい値を使用しました。 FLOAT(126)とNUMBERの値は、その値とまったく同じではないことに注意してください。

    PL/SQLは少し異なります。標準パッケージでは、次のように表示されます。

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

    PL/SQLブロックでREAL 変数は、無制限のNUMBERの任意の値を取ることができます 同じスケール/精度効果が可能であり、同じ効果があります。この場合、最も重要な(38- 40) 残りの数字を最初の40桁の最小値に丸めます。値の全体的な「サイズ」は72桁の数値として保持されますが、Oracleの内部形式で格納できる精度を超える精度は失われます。表の例と同じ変数タイプがあり、元の値を次の場所に配置する場合:

    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
    

    今回は、制限されていないFLOATとNUMBERが同じ値を示しているのに対し、制限されているFLOATは期待どおりの精度を持っていることに注意してください。

    つまり、40桁目以降はゼロが表示され、精度を超えて値が最上位桁に丸められているため、40桁目は4ではなく5になります。 SQL REALデータ型の精度は、63の2進数または18の10進数です。ただし、指定されていない限り、PL /SQLREALはNUMBERと一致します。




    1. OracleUpdateQueryにSETキーワードがありません-ORA97100およびORA-00904

    2. Hibernateアノテーション-大文字と小文字を区別しないUniqueConstraint

    3. symfonyクエリのエラー:期待される文字通り、取得しました''

    4. エラー:pdo_mysqlのインストール中にphp_pdo_driver.hが見つかりません