Определить формат даты для базы данных в оракуле

Я пытаюсь выполнить следующий 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 должен работать правильно без каких-либо ошибок,

Могу ли я определить формат даты для базы данных Oracle, поэтому нет необходимости определять его снова с каждым оператором SQL?

3 ответа

Это неправильный способ думать о программировании. Неявное это плохо, явное это хорошо. Если вы просто добавляете строку в столбец данных и надеетесь, что значение по умолчанию работает так, как вы ожидаете, вы, скорее всего, будете создавать ошибки и проблемы с производительностью.

Но я не смогу получить ответ на вопрос.

Измените параметр инициализации NLS_DATE_FORMAT.

Это довольно плохой SQL. Две проблемы: 1) Oracle не сможет оптимизировать (придется анализировать каждый раз, когда вы выполняете запрос), что замедляет работу базы данных; и 2) Вы открыты для атак с использованием SQL-инъекций.

Гораздо лучше использовать параметризованные запросы с подготовленными утверждениями, которые решат как вышеуказанные проблемы, так и проблему форматирования даты.

РЕДАКТИРОВАТЬ: Чтобы напрямую ответить на ваш вопрос, и если вы действительно не хотите переходить на подготовленные заявления (вас предупредили!), То вы можете сделать что-то вроде этого:

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

Но опять же, это очень плохая идея по причинам, указанным выше

Стандарт 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');
Другие вопросы по тегам