Как я мог бы использовать столбец даты по умолчанию на 21 день раньше другого столбца даты в oracle?

#sql #oracle #datetime #create-table

#sql #Oracle #дата и время #create-table

Вопрос:

Вот моя таблица (с рабочими столбцами, включая первичный ключ, удаленными для простоты)

  CREATE TABLE loans
    (checkout_date DATE,
     due_date DATE DEFAULT 'checkout_date'   21,
     )
 

Этот код возвращает «ORA-00932: несогласованные типы данных: ожидаемая ДАТА получения НОМЕРА».
Вместо этого значение ’21’ возвращает ту же ошибку.
Любая помощь приветствуется!

Комментарии:

1. вероятно, для этого потребуется триггер. но я бы, вероятно, предложил сделать это в коде, или, если он всегда на 21 день впереди, просто создайте представление

2. 'checkout_date' это строка. Применяя 21 его, вы заставляете Oracle думать, что строка содержит число, которое должно быть добавлено к 21. Отсюда и ошибка «ожидаемая ДАТА получения НОМЕРА».

3. Принятый ответ предполагает, что вам никогда не нужен был a DEFAULT (который используется при вставке строки без указания значения для столбца), а вычисляемый столбец (напрямую или через представление). Убедитесь, что вы понимаете разницу для будущих ситуаций.

Ответ №1:

Я не думаю, что Oracle поддерживает установку значения по умолчанию из другого столбца. Одним из обходных путей было бы использование триггера, но здесь это может быть излишним. Почему бы просто не поместить логику в представление?

 create view v_loans as 
select checkout_date, coalesce(due_date, checkout_date   21) as due_date from loans
 

Или мы можем немного пофантазировать с вычисляемым столбцом:

 create table loans (
    checkout_date date,
    due_date      date,
    real_due_date date as (coalesce(due_date, checkout_date   21))
);
 

Тогда вы будете использовать столбец real_due_date вместо due_date в своих запросах.

Чтобы все это имело больше смысла, вам, вероятно, потребуется not null ограничение на столбец checkout_date .

Примечание: как прокомментировали mathghy и Торстен Кеттнер, это не совсем точно реализует концепцию DEFAULT , потому что, даже если NULL значение явно присваивается столбцу, представление (и вычисляемый столбец) все равно будут применять логику замены (чего a DEFAULT не будет делать).

Комментарии:

1. Да, я не думаю, что oracle это сделает после долгих поисков. Большое спасибо, я поиграю с этими решениями.

2. Я думаю, вы сбиты с толку значением слова «по умолчанию». В insert инструкции значение по умолчанию используется только в том случае, если для этого столбца не указано значение — столбец не включен в список insert инструкции. Если null для столбца указано значение, то значение будет равно null , значение по умолчанию для этой ситуации не используется. Вы не можете сделать это с видом. На мой взгляд, этот ответ совершенно неверен; отрицательный ответ от меня.

3. @mathguy: Я действительно понимаю концепцию дефолта. Мой опыт работы с SO научил тому, что нам иногда нужно читать между строк то, что запрашивают OPS, вместо того, чтобы следовать строгой интерпретации — как бы то ни было, оказывается, OP принял этот ответ. Я все еще редактировал, чтобы быть более наглядным о том, как это ведет себя не совсем так, как DEFAULT во всех случаях (я бы согласился, что эта часть информации отсутствовала в моем ответе с самого начала).

4. Правильно — итак, мы согласны: если вы предполагаете, что ОП имел в виду что-то иное, чем то, что он спросил, вы должны четко указать это в верхней части своего ответа. Что касается того, что ОП принимает ответ и это доказывает что-то (что угодно ), давайте не будем вдаваться в подробности … 🙂

5. Вместо этого я создал представление, которое отлично подходит для того, что я пытаюсь сделать, спасибо, ребята, за полезную информацию здесь!