cyberkiwi уже ответил на ваш вопрос об ошибке синтаксиса.
Однако, поскольку вы новичок в SQL, я хотел бы прокомментировать сам DDL. В частности, похоже, что вы используете неправильные типы данных для ряда этих столбцов - это вернется, чтобы укусить вас.
- Не используйте тип данных CHAR, если у вас нет крайне веских причин для этого
Многие пользователи Oracle пойдут дальше и предложат вам никогда не использовать тип данных CHAR. Основная проблема с использованием CHAR заключается в том, что данные заполнены пробелами. Таким образом, если вы храните слово «Male» в столбце GENDER
, а GENDER
является CHAR (6), Oracle должен сохранить два дополнительных пробела в конце строки. Это делает будущие операции сравнения очень опасными - вы должны убедиться, что используется семантика сравнения CHAR, а не семантика сравнения VARCHAR, и это имеет тенденцию становиться уродливым. Кроме того, вы тратите пространство на диске и в памяти, чтобы сохранить эти два дополнительных пространства без какой-либо выгоды. Все ваши столбцы CHAR должны быть действительно VARCHAR2
- Хранить даты как даты - не хранить компоненты даты и не хранить даты как строки
Вместо того, чтобы хранить YEAR_OF_BIRTH
, MONTH_OF_BIRTH
и DAY_OF_BIRTH
, вам почти наверняка лучше использовать один столбец BIRTH_DATE
типа DATE, в котором хранится дата рождения. Вы всегда можете извлечь различные компоненты даты, если хотите узнать, в каком году кто-то родился. Хранение данных в качестве ДАТЫ, тем не менее, гарантирует, что сами компоненты даты действительны (т.е. нет опечаток, где месяц указан как «Февраль», нет проблем с качеством данных, где месяц иногда «Февраль», иногда «Февраль», и иногда «2», без дат 30 февраля и т. д.). Хранение данных в виде ДАТЫ дает оптимизатору гораздо больше информации для работы, поэтому он с большей вероятностью сгенерирует наиболее эффективный план, поскольку он знает что-то о распределении данных. И вы можете использовать все различные функции даты, которые предоставляет Oracle.
Точно так же, поскольку CREATE_TIME
и MOD_TIME
являются датами (Oracle DATE всегда имеет компонент дня и времени), вы должны хранить их как DATE (или TIMESTAMP), а не VARCHAR2. Это позволяет вам использовать функции даты (или отметки времени), гарантирует, что время является действительным, устраняет проблемы с различными форматами, хранящимися в одном и том же столбце, и значительно упрощает использование различных функций даты.