#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. Вместо этого я создал представление, которое отлично подходит для того, что я пытаюсь сделать, спасибо, ребята, за полезную информацию здесь!