当前位置: 首页 > 面试题库 >

Oracle为什么在存在称为时间戳记的字段时创建触发器失败?

闾丘鸣
2023-03-14
问题内容

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

创建表时,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

没有两行带有单词“ timestamp”的任何组合都可以正常工作。我本以为语法足以区分关键字和列名。

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

澄清说明

我知道问题是存在一个称为timestamp的列,该列可能是关键字也可能不是关键字。我的问题是为什么在我尝试创建触发器时而不是在创建表时就拒绝它了,所以我至少会期望得到一个警告。

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

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


问题答案:

以下是有关metalink的有关此(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.


 类似资料:
  • 请帮助我解决以下问题 我需要创建一个名为的触发器,每当“contact”表更新时就会触发该触发器。在更新联系人详细信息之后,这个触发器将把org_name和action插入到表中。受影响日志表中的操作名称为。 id整数org_name varchar2(255)street_address1 varchar2(255)street_address2 varchar2(255)城市varchar2(

  • 问题内容: 我刚刚发现,运行日历脚本时,PHP中的时间戳限制为2038。这实际上是什么意思?为什么是2038,而不是2050或2039?如果时间戳仅是从给定日期(1970年)起算的秒数,为什么还要设置限制? 问题答案: 该限制是由大多数C库用来表示该计数的4字节带符号整数强加的。快速数学(假设365天年,并非完全正确): 这也意味着下限约为1900。一些库已经开始引入64位纪元计数,但目前它们之间

  • 问题内容: mysql有什么方法可以在创建时自动将时间戳存储在记录行中。我试图将timestamp(数据类型)与current_timestamp用作默认值,但后来意识到,每当记录更新时,它将更新。我只需要一些可以存储创建时间戳记的东西。 谢谢 问题答案: 设置DEFAULT约束以使用CURRENT_TIMESTAMP: 对于现有表,请使用ALTER TABLE语句: 除非您为date_colum

  • 问题内容: 我想为此varchar创建一个序列。如果用数字而不是varchar会更容易。在这种情况下,我可以 seq_no:= seq_no + 1; 但是,当我想将列中的下一个值存储为A0000002且前一个值为A0000001时(将下一个varchar rowby中的数字增加1),该怎么办? 问题答案: 这可以通过 您的示例可以通过在oracle中创建序列来完成 然后 现在我已经用过双重..但

  • 问题内容: 除了MSSQL和SQLite之外,我还将扩展现有应用程序的数据层以与Firebird 2.5一起使用,但是我遇到了一个绊脚石。 我有一个名为TimeStamp的字段,该字段将数据/时间存储为TimeStamp类型。在类型为datetime的MSSQL和SQLite下,此方法可以正常工作,但在Firebird下适用。以下SQL: 似乎有效,但是TimeStamp字段以字段名称“ CONS

  • 问题内容: 如何创建日期为23/09/2007的时间戳记? 问题答案: 通过,我相信你的意思。您会注意到,该类具有一个接受参数的构造函数。您可以使用以下类进行解析: