0

次のSQLを実行しようとしています:

INSERT INTO "x" 
   ("x_id", "requested_function", "user_action", "t_users_id", "date", "wf_process", "details") 
VALUES 
   ('66', 'index', 'view', '1', '2011-02-04 22:14:19', '15', '');

..しかし、次のエラーが発生します: ORA-01861: リテラルがフォーマット文字列と一致しません。

このエラーは、次のような日付形式を追加すると解決しました:

INSERT INTO "x" 
  ("x_id", "requested_function", "user_action", "t_users_id", "date", "wf_process", "details") 
VALUES 
  ('66', 'index', 'view', '1',to_date('2011-02-04 22:14:19','yyyy-mm-dd hh24:mi:ss'), '15', '');

各 SQL ステートメントの日付形式を定義したくありません。この形式をデータベース内のすべての日付フィールドの標準にしたいのですが、定義する必要はありません。つまり、最初の SQL ステートメントはエラーなしで正しく実行する必要があります。 .

各 SQL ステートメントで再度定義する必要がないように、Oracle データベースの日付形式を定義できますか?

4

3 に答える 3

6

それはプログラミングについて考える間違った方法です。暗黙は悪いです、明示は良いです。文字列をデータ列に投げ込み、デフォルトが期待どおりに機能することを期待する場合、バグやパフォーマンスの問題が発生する可能性が非常に高くなります。

しかし、質問への答えを得るのを邪魔するのは私から遠く離れています。

NLS_DATE_FORMAT初期化パラメータを変更します。

于 2011-02-04T21:05:33.703 に答える
1

それはかなり悪いSQLです。2つの問題:1)Oracleは最適化できず(クエリを実行するたびに解析する必要があります)、データベース操作が遅くなります。2)SQLインジェクション攻撃に対してオープンです。

プリペアドステートメントでパラメータ化されたクエリを使用することをお勧めします。これにより、上記の問題と日付のフォーマットの問題の両方が解決されます。

編集:あなたの質問に直接答えるために、そしてあなたが本当に準備されたステートメントに切り替えたくない場合(あなたは警告されています!)、あなたはこのような何かをすることができます:

INSERT INTO X VALUES (99, TO_DATE('2010/02/04 16:30:00', 'YYYY/MM/DD HH24:MI:SS'));

しかし、繰り返しになりますが、上記の理由から、これは非常に悪い考えです。

于 2011-02-04T20:52:50.943 に答える
0

ここでは、日付と時刻のリテラルに関する SQL92 標準を使用します。

TIMESTAMP 'YYYY-MM-DD HH:MM:SS'
DATE 'YYYY-MM-DD'
TIME 'HH:MM:SS'

使用例は次のとおりです。

INSERT INTO X VALUES (99, TIMESTAMP '2010-02-04 16:30:00');
于 2011-02-04T21:17:15.747 に答える