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

数値を文字列に変換した後にスラッシュ値を返すTO_char

    テーブル内のデータが破損しているようです。どうやってそこにたどり着いたのか、それについて何ができるのかなど、いくつかの質問につながりますか?

    不正な数値(または日付 )値は多くの場合OCIプログラムから取得されますが、impを示唆するバグレポートがいくつかあります。 破損を引き起こすことが知られています。内部表現はサポートノート1007641.6に記載されていますが、この説明 問題を再現する際の操作が簡単で、OCIプログラムの代わりにPL/SQLブロックを使用できます。

    問題が発生している2つの数値は、次のように内部的に表す必要があります。

    select dump(0.000000000099, 16) as d1,
        dump(0.000000001680, 16) as d2
    from dual;
    
    D1                 D2
    ------------------ ---------------------
    Typ=2 Len=2: bb,64 Typ=2 Len=3: bc,11,51
    

    テーブルにどのような値があるのか​​正確にはわかりませんが、同様の結果を示すことができます:

    create table t42 (amount number(32,12)) nologging;
    
    declare
        n number;
    begin
        dbms_stats.convert_raw_value('bb65', n);
        insert into t42 (amount) values (n);
        dbms_stats.convert_raw_value('bc100000', n);
        insert into t42 (amount) values (n);
    end;
    /
    

    値をダンプすると、少し奇妙に見えることがわかります:

    column d1 format a25
    column d2 format a25
    select amount, dump(amount) d1, dump(amount, 16) d2
    from t42;
    
                         AMOUNT D1                        D2                      
    --------------------------- ------------------------- -------------------------
                  0.00000000010 Typ=2 Len=2: 187,101      Typ=2 Len=2: bb,65        
                 0.000000001499 Typ=2 Len=3: 188,16,0     Typ=2 Len=3: bc,10,0      
    

    それに対してフォーマットを実行すると、同様の結果が得られます:

    select amount as actual__________amount,
        TO_CHAR(amount,'FM99999999999999999999999999999990.099999999999')
            as amount__________Changed
    from t42
    order by amount;    
    
         ACTUAL__________AMOUNT AMOUNT__________CHANGED                      
    --------------------------- ----------------------------------------------
                  0.00000000010 ############################################## 
                 0.000000001499 0.00000000150/
    

    dump()を追加できる場合 質問に対する独自のデータを出力すると、表示されている値を正確に再作成できるかどうかを確認できます。

    逸話的に、データを更新することでこれを「修正」できる可能性があります。例:

    update t42 set amount = amount * 1;
    
    select amount, dump(amount) d1, dump(amount, 16) d2
    from t42;
    
                         AMOUNT D1                        D2                      
    --------------------------- ------------------------- -------------------------
                   0.0000000001 Typ=2 Len=2: 188,2        Typ=2 Len=2: bc,2         
                 0.000000001499 Typ=2 Len=3: 188,15,100   Typ=2 Len=3: bc,f,64
    
    select amount as actual__________amount,
        TO_CHAR(amount,'FM99999999999999999999999999999990.099999999999')
            as amount__________Changed
    from t42
    order by amount;
    
         ACTUAL__________AMOUNT AMOUNT__________CHANGED                      
    --------------------------- ----------------------------------------------
                   0.0000000001 0.0000000001                                   
                 0.000000001499 0.000000001499                                 
    

    ただし、実際の正しい値は何かを尋ねる必要があります。これはおそらく、破損した方法/理由/時期に戻ります。このデータが重要である場合、私はこのデータに触れることを非常に警戒し、本当に それを整理するためにOracleサポートを関与させるには、@DazzaLのアドバイスを2番目にする必要があります。




    1. Railsアプリエラー-ActiveRecord::PendingMigrationError移行は保留中です。 'rake db:migrate RAILS_ENV =development'を実行して、この問題を解決します

    2. sqlselect構文のヘルプ

    3. 過度のMySQLアクティビティ

    4. Oracleは、select句で定義されたデータチャンクのチェックサム値を取得します