Oracle, почему создание триггера завершается ошибкой, когда есть поле с именем timestamp? - PullRequest
5 голосов
/ 12 ноября 2008

Я только что потратил последние два часа своей жизни, пытаясь создать таблицу с автоматически возрастающим первичным ключом на этом уроке , урок - это большая проблема, с которой я столкнулся, это то, что Создать цель не удается, если у меня есть столбец, который является меткой времени, и таблица, которая называется меткой времени в той же таблице ...

Почему оракул не помечает это как проблему при создании таблицы?

Вот последовательность команд, которые я ввожу:

  1. Создание таблицы:

    CREATE TABLE myTable
       (id NUMBER PRIMARY KEY,
        field1 TIMESTAMP(6),
        timeStamp NUMBER,
    );
    
  2. Создание последовательности:

    CREATE SEQUENCE test_sequence
    START WITH 1
    INCREMENT BY 1;
    
  3. Создание триггера:

    CREATE OR REPLACE TRIGGER test_trigger  
    BEFORE INSERT  
    ON myTable  
    REFERENCING NEW AS NEW  
    FOR EACH ROW  
    BEGIN  
    SELECT test_sequence.nextval INTO :NEW.ID FROM dual;  
    END;  
    /
    

Вот сообщение об ошибке, которое я получаю:

ORA-06552: PL/SQL: Compilation unit analysis terminated
ORA-06553: PLS-320: the declaration of the type of this expression is incomplete or malformed

Любая комбинация, в которой нет двух строк со словом «отметка времени», работает нормально. Я бы подумал, что синтаксиса будет достаточно, чтобы различать ключевое слово и имя столбца.

Как я уже сказал, я не понимаю, почему таблица создается нормально, но оракул падает, когда я пытаюсь создать триггер ...

ПОЯСНЕНИЯ

Я знаю, что проблема в том, что существует столбец с именем timestamp, который может быть или не быть ключевым словом. Моя проблема в том, почему это вызвало ошибку, когда я пытался создать триггер, а не когда я создавал таблицу, я бы по крайней мере ожидал предупреждение.

Тем не менее, если использовать Oracle в течение нескольких часов, в отчетах об ошибках это выглядит гораздо менее многословно. Может быть, только потому, что я использую экспресс-версию.

Если это ошибка в Oracle, как тот, у кого нет контракта на поддержку, будет сообщать об этом? Я просто играю с экспресс-версией, потому что мне нужно перенести некоторый код из MySQL в Oracle.

Ответы [ 6 ]

9 голосов
/ 13 ноября 2008

На металинке есть примечание об этой (227615.1) выдержке ниже:

# symptom: Creating Trigger fails
# symptom: Compiling a procedure fails
# symptom: ORA-06552: PL/SQL: %s
# symptom: ORA-06553: PLS-%s: %s     
# symptom: PLS-320: the declaration of the type of this expression is incomplete or malformed
    # cause: One of the tables being references was created with a column name that is one of the datatypes (reserved key word). Even though the field is not referenced in the PL/SQL SQL statements, this error will still be produced.

    fix:

    Workaround:

    1. Rename the column to a non-reserved word.
    2. Create a view and alias the column to a different name.
3 голосов
/ 12 ноября 2008

TIMESTAMP не указан в документации Oracle как зарезервированное слово (что удивительно).

Он указан в представлении словаря данных V $ RESERVED_WORDS, но его флаг RESERVED установлен на «N».

Это может быть ошибка в обработке триггера. Я бы сказал, что это хорошая поддержка Oracle.

1 голос
/ 12 ноября 2008

Вы намекали на ответ сами. Вы используете timestamp в качестве имени столбца, но это также ключевое слово. Измените имя столбца на другое (например, xtimestamp) и триггер скомпилирует.

0 голосов
/ 14 января 2016

Вы можете выполнить через EXECUTE IMMEDIATE. Это не лучший способ, но работа и избегайте переименования столбцов.

В моем случае переименование столбца будет каотичным образом

0 голосов
/ 16 марта 2011

Вместо того, чтобы Oracle поддерживал представление, используйте EXECUTE IMMEDIATE (т.е. если «Переименовать столбец в незарезервированное слово» не вариант.

0 голосов
/ 12 ноября 2008

Ну, я не совсем уверен в этом, но я думаю, что это происходит потому, что код SQL, используемый для манипулирования объектами базы данных и доступа к ним, интерпретируется неким интерпретатором, отличным от того, который используется для интерпретации кода PL / SQL.

Имейте в виду, что SQL PL / SQL - это разные вещи, и поэтому они обрабатываются по-разному. Итак, я думаю, что в одном интерпретаторе есть какая-то ошибка, но я не уверен, какой именно.

...