3

日付列を SYSDATE と比較すると、次のエラーが発生するという奇妙な問題が発生しています。

01858. 00000 -  "a non-numeric character was found where a numeric was expected"
*Cause:    The input data to be converted using a date format model was
           incorrect.  The input data did not contain a number where a number was
           required by the format model.
*Action:   Fix the input data or the date format model to make sure the
           elements match in number and type.  Then retry the operation.

MATERIALIZED VIEW を再作成しています。これにはいくつかのマイナーな変更が含まれており、プロセスが中止されるたびに、次の派生テーブル クエリの「>=」が常にポイントされます。

SELECT id, 
  desc,
  start_date,
  end_date
 FROM T_LIPR_POLICY_ROLE TLPR
 WHERE end_date >= SYSDATE

end_date は DATE 型になり、実際にこのクエリを単独で実行できますが、マテリアライズド ビューで実行しようとすると、常に上記のエラーで中止されます。先週ですが、同じクエリで作成できました。

何か案は?

ありがとうございました、

4

2 に答える 2

1

こんにちは、大変遅くなり申し訳ありません。セキュリティ上の理由から、ステートメント全体を投稿できませんでした。

これで問題は解決しました。問題は、マテリアライズド ビュー スクリプトが UNION を介して 17 の異なる場所からデータを集約していたことです。何らかの理由で、エラーが間違ったコード行を指していました (以下を参照)。

SELECT id, 
 desc,
 start_date,
 end_date
FROM T_LIPR_POLICY_ROLE TLPR
WHERE end_date >= SYSDATE <-- ORACLE POINTS TO THIS LINE

これはスクリプトの 10 番目のステートメントのようなものですが、実際にはスクリプトの 6 番目のステートメントにエラーがありました。これは明らかに誤解を招くものでした。このステートメントでは、特定のレコード (数百万件中) が次の操作を試みていました。

to_date('  / 0/    ') <-- This was the cause of the problem.

このテキストは実際のスクリプトでは文字通り to_date(<varchar 型の列名>) と表現されていませんが、1,500 万件中 2 件のレコードに上記のテキストが含まれていることに注意してください。

ここでよくわからないのは、Oracle が間違ったコード行を指している理由です。

それはオラクルの問題ですか?¿それは SQL Developer に問題がありますか? ¿それはヒントとの競合でしょうか? 次のようなものをいくつか使用します: /*+ PARALLEL (init 4) */

いつもお世話になっております。

于 2013-02-14T13:38:48.217 に答える
0

desc は列名ですか? はいの場合、オラクルの予約キーワード desc を列名として使用しています。

SELECT id, 
  desc,---- here
  start_date,
  end_date
 FROM T_LIPR_POLICY_ROLE TLPR
 WHERE end_date >= SYSDATE

列名にオラクルの予約キーワードを使用することはできません。

列名を変更してください。

于 2013-02-09T15:47:31.600 に答える