5

我刚刚浪费了过去两个小时试图根据本教程创建一个具有自动递增主键的表本教程很棒,我遇到的问题是如果我有一个列,则创建目标会失败这是一个时间戳和一个在同一个表中称为时间戳的表......

为什么 oracle 在我创建表时不将此标记为问题?

这是我输入的命令序列:

  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

任何没有两行和“时间戳”字样的组合都可以正常工作。我原以为语法足以区分关键字和列名。

正如我所说,我不明白为什么表创建得很好,但是当我尝试创建触发器时,oracle 崩溃了......

澄清

我知道问题在于有一个名为 timestamp 的列,它可能是也可能不是关键字。我的问题是为什么当我尝试创建触发器而不是创建表时它会发出声音,我至少会收到警告。

也就是说,使用 Oracle 几个小时后,它的错误报告似乎不那么冗长了,也许只是因为我使用的是 express 版本。

如果这是 Oracle 中的一个错误,没有支持合同的人将如何报告它?我只是在玩快速版本,因为我必须将一些代码从 MySQL 迁移到 Oracle。

4

6 回答 6

9

关于此(227615.1)摘录,metalink 上有一个注释:

# 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.
于 2008-11-13T14:12:07.920 回答
3

TIMESTAMP 未在 Oracle 文档中作为保留字列出(这令人惊讶)。

它列在 V$RESERVED_WORDS 数据字典视图中,但其 RESERVED 标志设置为“N”。

这可能是触发器处理中的错误。我会说这是一个很好的 Oracle 支持。

于 2008-11-12T20:58:43.300 回答
1

你自己已经暗示了答案。您将timestamp其用作列名,但它也是关键字。将列名更改为其他名称(例如xtimestamp)并编译触发器。

于 2008-11-12T17:42:12.027 回答
0

好吧,我对此并不完全确定,但我认为这是因为用于操作和访问数据库对象的 SQL 代码是由某种解释器解释的,与用于解释 PL/SQL 代码的解释器不同。

请记住,SQL 和 PL/SQL 是不同的东西,因此它们的处理方式不同。所以,我认为一个解释器有一些错误,只是不确定哪个是。

于 2008-11-12T17:36:41.117 回答
0

不要让 Oracle 维护视图,而是使用 EXECUTE IMMEDIATE(即,如果“将列重命名为非保留字”不是一个选项。

于 2011-03-16T19:14:19.900 回答
0

您可以通过 EXECUTE IMMEDIATE 执行。它不是更好的方法,而是工作并避免列重命名。

在我的情况下,重命名列将是一种混乱的方式

于 2016-01-14T19:51:27.010 回答