3

関数とプロシージャを記述しているスクリプトがあります。スクリプトは、エラーや警告なしで Oracle SQL 開発者で完全に正常に動作します。このスクリプトは、クライアント側の顧客に提供する必要があります。顧客ユーザーが同じスクリプトを実行するとTOAD、エラー メッセージが表示されます。

ORA-01830: date format picture ends before converting entire input string

このような状況では、そのようなエラーを処理する方法が本当にわかりません。これは のバグTOADですか? 関数で andを使用するto_dateと 、エラーが発生します。to_timestamp

4

1 に答える 1

7

暗黙的な日付変換または暗黙的な形式モデルに依存しています。あなたが使用to_dateto_timestampていると言ったので、後者のようです。コードは表示されていませんが、エラーは、表示されると予想される形式の文字列値でこれらの関数を呼び出していることを意味しますが、関数の 2 番目の引数として形式モデルを明示的に提供していません。これにより、セッションの NLS_DATE_FORMAT 設定が使用されます。もしあなたがそうするなら:

to_date('12/06/2015 09:10:11')

次に、あなたは本当に効果的にやっています:

to_date('12/06/2015 09:10:11', (select value from nls_session_parameters where parameter = 'NLS_DATE_FORMAT'))

顧客が NLS 環境をどのように構成するかを制御することはできないため、暗黙的な変換や NLS の仮定に頼らないでください。

ドキュメントにあるように:

注意:
次のセクションの例に示すように、常に TO_DATE で書式マスク (fmt) を指定することをお勧めします。書式マスクなしで使用する場合、この関数は、char が NLS_TERRITORY または NLS_DATE_FORMAT パラメータによって決定されるものと同じ書式を使用する場合にのみ有効です。さらに、依存関係を避けるために明示的な書式マスクが指定されていない限り、関数はデータベース間で安定しない可能性があります。

これが単純なクエリにどのように影響するかを次のように確認できます。

SQL> alter session set nls_date_format = 'DD/MM/YYYY HH24:MI:SS';

Session altered.

SQL> select to_date('12/06/2015 09:10:11') from dual;

TO_DATE('12/06/2015
-------------------
12/06/2015 09:10:11

SQL> alter session set nls_date_format = 'DD/MM/YYYY';

Session altered.

SQL> select to_date('12/06/2015 09:10:11') from dual;
select to_date('12/06/2015 09:10:11') from dual
               *
ERROR at line 1:
ORA-01830: date format picture ends before converting entire input string

同じ理由で、月名の解釈は NLS_DATE_LANGUAGE によって異なるため、月名は避ける必要があります。ただし、本当に必要な場合は、少なくともクエリ レベルでオーバーライドできます。

固定値を使用している場合は、日付とタイムスタンプのリテラルも考慮する必要があります。

select date '2015-06-12' ...
select timestamp '2015-06-12 09:10:11' ...

ただし、文字列を作成して日付に変換する場合、それは適切ではありません。

于 2015-06-12T10:35:01.647 に答える