0

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

3 回答 3

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.
于 2012-07-24T18:27:35.263 回答
1

扩展评论...

该错误是由表中命名的列引起timestampcomments。使用保留字作为对象名称不是一个好主意,因为它会导致混乱和晦涩难懂的问题,并且可能需要转义(如此)。

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

这似乎是错误 6331062,'PLS-320 if a column name is a datatype (eg "TIMESTAMP")',错误报告说已在补丁集 10.2.0.5(见注释 1088172.1)和 11.1.0.7 中修复,并且在 11gR2 基本版本中 - 这可以解释为什么 Justin 和 Craig 没有看到它。(我假设 Justin 使用的是 11gR2;Craig 的输出显示他使用的是 11.1.0.7)。

于 2012-07-25T07:32:50.163 回答
0

什么版本的甲骨文?

另外,如果您只是将触发代码直接放入 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.
于 2012-07-24T19:28:02.383 回答