1

レポートに 2 つのパラメーターがあります。データ型が日付のクエリです。fnd_standard_date値セットとして選択しました。クエリは次のとおりです。

Select ordered_date, order_number, customer_id
From order_tbl xx       
Where  NVL(:P_ORDER_NUMBER, xx.order_number) = xx.order_number
 and xx.ordered_date between NVL(trunc(TO_DATE(:P_FROM_DATE, 'YYYY/MM/DD HH24:MI:SS')), xx.ORDERED_DATE) and NVL(trunc(TO_DATE(:P_TO_DATE, 'YYYY/MM/DD HH24:MI:SS'), xx.ORDERED_DATE)
    AND NVL(:P_CUSTOMER, xx.customer_id) = xx.customer_id>

SQLDeveloper では結果は問題ありませんが、Oracle アプリでは直面しています

java.sql.SQLDataException: ORA-01843: 有効な月ではありません

このパラメーターにはどの値セットを使用できますか?
また、どの形式を渡すことができますか?

4

2 に答える 2

1

あなたが言うように、パラメーターがすでに DATE である場合は、TO_DATE()それらを呼び出すべきではありません。これにより、セッションの NLS_DATE_FORMAT を使用して日付が文字列に暗黙的に変換され、指定した形式モデルを使用してその文字列が日付に変換されます。

NLS_DATE_FORMAT がたまたま指定したものと一致する場合は機能しますが、それが事実であることに依存するべきではなく、暗黙的な変換を行うべきではありません。とにかく必要以上の仕事をしています。

したがって、単純化して次のようにします。

Select ordered_date, order_number, customer_id
From order_tbl xx       
Where  NVL(:P_ORDER_NUMBER, xx.order_number) = xx.order_number
and xx.ordered_date between NVL(trunc(:P_FROM_DATE), xx.ORDERED_DATE)
   and NVL(trunc(:P_TO_DATE), xx.ORDERED_DATE)
AND NVL(:P_CUSTOMER, xx.customer_id) = xx.customer_id>

コマンドで P_DATE_FROM と _TO を文字列として宣言してSQL Developerから実行している場合は、もちろんvariable使用する必要がありますTO_DATE()。2 つの状況は同じではありません。

于 2015-06-24T11:22:19.660 に答える