1

このケースは、Focus のデータ処理システムに抽出された Oracle データベースに無効なデータがあった (そして引き続き入ってくる) 現実の状況で発生します。フォーカスは、無効な時間部分を含むいくつかの行で窒息して死にます。その後、Oracle DBA は適切な列から影響を受ける列に日時をコピーして、プロセスを続行できるようにします (ええ、私は知っています)。

問題のトラブルシューティングを支援したところ、Oracle で影響を受ける行で次のことがわかりました。

DUMP(START_TIME)

与えます:

'Typ=12 Len=7: 100,99,255,255,0,0,0'

その間:

TO_CHAR(START_TIME, 'YYYY/MM/DD HH24:MI:SS')

与えます:

ORA-01801: date format is too long for internal buffer

DUMP()結果、'Typ=12 Len=7: 100,99,255,255,0,0,0'および格納規則を見ると、列のセマンティック制限をバイパスして、0、-1、-1、-1、-1、-1、-1 または0x00 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF

バイト、符号、オーバーフローの解釈方法によっては、0xFF = 255 = -1結果が生じる可能性があるため、これは「理にかなっています」 。0000/255/255 255:255:255

Oracle はどのような条件 (接続メカニズムなど) で、無効なデータが日時列に入るのを許可しますか?

4

2 に答える 2

6

オラクルは通常、それを許可しません。OCIレイヤーはデータ型の検証をバイパスできます.Oracleは基本的に、これらの7バイトに入力したものが有効な日付であることを信頼しています. 同様に、OCI レイヤーでは、Oracle は 7 バイトの「日付」を返すことができます。これらのバイトを必要に応じて処理するのは、クライアント ソフトウェア次第です (そのままにしておくか、文字列またはエポック番号に変換します... ) おそらく、より良いアプローチは、そこにデータをロードするものを見つけ出し、それが日付で何をしているのかを確認することです.

非常にひねくれていると感じている場合は、日付に文書化されていない REVERSE 関数を使用して無効にすることができます。

于 2008-11-18T04:29:34.240 に答える
1

クイック メタリンク検索ではバグを見つけることができないようですが (Oracle で SR をまだ開いていない場合は、そうすることをお勧めします)、OCI レイヤー (Oracle Call Interface) にバグがあったことはわかっています。無効な日付を挿入するバグのあるコード。ただし、ほとんどの場合、これらのバグはしばらくの間修正されているため、挿入を実行しているクライアント マシンに最新のパッチセットを適用すれば、問題が解消されることに賭ける傾向があります。

于 2008-10-15T16:26:41.547 に答える