在Oracle中触发失败

时间:2012-07-24 18:22:11

标签: oracle triggers

编辑:这里的每个请求都是SQL * Plus中发生的事情 编辑2:问题是列名是关键字     SQL>删除表评论;

Table Dropped.

SQL> create table comments (
 2 comment_id number not null,
 3 post_id number not null,
 4 user_id number not null,
 5 message varchar2(2500) not null,
 6 timestamp timestamp(6) not null);

Table Created

SQL> create sequence comment_seq
 2 start with 1
 3 increment by 1
 4 nomaxvalue;

Sequence Created

SQL> ed

Wrote file afiedt.buf //NOTEPAD OPENED UP

1 create or replace trigger comment_trigger
2      before insert on comments
3      for each row
4 begin
5     select comment_seq.nextval
6     into :new.comment_id
7     from dual;
8 end;
SQL> /

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

    SQL> show errors
    No errors.

3 个答案:

答案 0 :(得分:2)

假设我更正了数字列的数据类型(number(300)不是有效的数据类型),那么该代码似乎对我有用。如果您收到错误,这意味着您正在做的事情不是您在此处发布的内容。

SQL> create table comments (
  2    comment_id number not null,
  3    post_id    number not null,
  4    user_id    number not null,
  5    message    varchar2(2500) not null,
  6    timestamp  timestamp(6) not null
  7  );

Table created.

SQL> create sequence comment_seq
  2  start with 1
  3  increment by 1
  4  nomaxvalue;

Sequence created.

SQL> ed
Wrote file afiedt.buf

  1  create or replace trigger comment_trigger
  2    before insert on comments
  3    for each row
  4  begin
  5    select comment_seq.nextval
  6      into :new.comment_id
  7      from dual;
  8* end;
SQL> /

Trigger created.

答案 1 :(得分:1)

扩展评论...

错误是由timestamp表中名为comments的列引起的。使用保留字作为对象名称不是一个好主意,因为它可能导致混淆和模糊问题,并且可能需要进行转义(如here)。

在这种情况下,即使创建的表没有错误,触发器(尽管它可能是任何已编译的PL / SQL'库单元')也会失败,特别是因为列名是数据类型而不仅仅是一个保留的词。

这似乎是错误6331062,'PLS-320,如果列名是数据类型(例如“TIMESTAMP”)',则错误报告中的错误报告已在补丁集10.2.0.5(见注释1088172.1)和11.1中修复。 0.7,并在11gR2基地发布 - 这可以解释为什么贾斯汀和克雷格没有看到它。 (我假设Justin在11gR2; Craig的输出显示他在11.1.0.7)。

答案 2 :(得分:0)

什么版本的Oracle?

此外,如果您只是将触发器代码直接放入SQL * Plus而不是使用“ed”会发生什么?

但很奇怪,因为你的脚本对我来说很合适:

Oracle Database 11g Enterprise Edition Release 11.1.0.7.0

SQL> create table comments (
  2   comment_id number not null,
  3   post_id number not null,
  4   user_id number not null,
  5   message varchar2(2500) not null,
  6   timestamp timestamp(6) not null);

Table created.

SQL> create sequence comment_seq
  2   start with 1
  3   increment by 1
  4   nomaxvalue;

Sequence created.

SQL> ed
Wrote file afiedt.buf

  1  create or replace trigger comment_trigger
  2        before insert on comments
  3        for each row
  4   begin
  5       select comment_seq.nextval
  6       into :new.comment_id
  7       from dual;
  8*  end;
SQL> /

Trigger created.