【问题标题】:ORA-00904: "TYPE": invalid identifier on trigger. Where have I gone wrong?ORA-00904: "TYPE": 触发器上的标识符无效。我哪里做错了?
【发布时间】:2019-06-27 00:51:30
【问题描述】:

我创建了一个主键自动递增的表。我已经发送了相关数据、序列和触发器。但到目前为止,我还没有希望执行自动增量,而且我的触发器不断抛出错误。

代码:

CREATE SEQUENCE empid_seq
INCREMENT BY 1
START WITH 1101
NOCACHE;

CREATE TRIGGER empuser_trigger
before insert on empuser
for each row
begin
if :new.empuserid.nextval into :new.empuserid from dual;
end if;
end;
/


INSERT INTO empuser VALUES(empid_seq.nextval, 'James', 'Kirk', '+447911123456', '401', '203', (SELECT messageid FROM message WHERE messageid = '2101'));
INSERT INTO empuser VALUES(empid_seq.nextval, 'Spock', 'Spock?', '+447911123466', '401', '203', (SELECT messageid FROM message WHERE messageid = '2103'));
INSERT INTO empuser VALUES(empid_seq.nextval, 'Leonard', 'McCoy', '+447911144456', '401', '203', (SELECT messageid FROM message WHERE messageid = '2104'));
INSERT INTO empuser VALUES(empid_seq.nextval, 'Hikaru', 'Sulu', '+447911123856', '401', '203', (SELECT messageid FROM message WHERE messageid = '2106'));

我想要的是 ID 在用户输入时自动递增。

【问题讨论】:

    标签: sql oracle oracle11g sql-insert database-trigger


    【解决方案1】:

    if 语句的比较主要问题可能是:

    if <some condition> = <other condition> then 
     :new.empuserid := empid_seq.nextval;
    end if;
    

    然后你可以试试下面的:

    因为只有一个候选列 emp user id 是表的第一列,所以从插入语句中可以理解,没有 empuser 表的列列表,那么您似乎正在尝试设置 @ 987654324@按顺序有两种方式

    摆脱其中一个:

    删除

    :new.empuserid.nextval into :new.empuserid from dual;, 即删除触发器。

    empid_seq.nextval,在insert语句中,并作为触发器传入

    :new.empuserid := empid_seq.nextval; 顺便明确列出所有列,除了插入语句中的empuseridINSERT INTO empuser(col2,col3...) VALUES。将这些插入语句转换为

    INSERT INTO empuser
    SELECT empid_seq.nextval, 'James', 'Kirk', '+447911123456', '401', '203',
           messageid 
      FROM message 
     WHERE messageid = '2101'
    

    【讨论】:

    • 谢谢,我摆脱了解决问题的触发器!但是现在当我尝试通过 apex 输入记录时,我不断收到 ORA-01400:无法将 NULL 插入到 empuser.empuserid 中。 (我在这个字段中输入一个值),你知道这里可能是什么问题吗?很抱歉问了另一个问题,但我真的被困住了。
    • @TheBiz 欢迎,似乎并期望 id 列是主要类型,因此是强制性的。您已经在插入语句中使用了empid_seq.nextval,那么不应该引发这样的异常。请重试。
    • 正确。我正在尝试在 Apex 内的主详细信息表单上输入此内容。它不会自动增加我的 ID,如果我在 apex 上手动输入一个 ID,它也不会接受。它只接受我预先插入到我的代码中的 id 值(例如出于目的)。我收到错误 ORA-20505。
    • @TheBiz 您是否尝试保留触发器,并删除插入语句的第一个组件(empid_seq.nextval
    • 如果保留触发器,@TheBiz :new.empuserid.nextval 应转换为 :new.empuserid := empid_seq.nextval
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 2011-04-21
    • 1970-01-01
    相关资源
    最近更新 更多