编辑:这里的每个请求都是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.
答案 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.