Oracle DB触发器语法

时间:2017-05-31 12:08:55

标签: oracle plsql triggers

我试图让表格Staff的主键自动排序。

输入:

CREATE SEQUENCE staff_idseq START WITH 1 INCREMENT BY 1 MAXVALUE 9999;
CREATE TABLE Staff
(
    staffid         number(4) not null primary key,
    name            varchar2(21) not null unique,
    permission      varchar2(10) not null
);
CREATE OR REPLACE TRIGGER staff_idtrig
    BEFORE INSERT ON Staff
    FOR EACH ROW WHEN (new.staffid is null)
    BEGIN
        SELECT staff_idseq.nextval INTO :new.staffid FROM dual;
    END;

但是当我加载它时,在创建序列和表之后,它要求我输入更多命令,好像我忘了在行尾添加分号。也许在我的查询中有一些错误,但是我找不到我犯的错误,因为我没有使用Ctrl + c从输入提示中退出。

1 个答案:

答案 0 :(得分:1)

触发器是PL / SQL程序,它使用分号作为行终止符。因此,要执行create or replace语句,我们需要在新行上使用正斜杠完成代码。

试试这个:

CREATE OR REPLACE TRIGGER staff_idtrig
    BEFORE INSERT ON Staff
    FOR EACH ROW WHEN (new.staffid is null)
BEGIN
    SELECT staff_idseq.nextval INTO :new.staffid FROM dual;
END;
/

正如@a_horse_with_no_name所说,如果您使用11g,为什么不使用这种更简单的语法:

:new.staffid := staff_idseq.nextval;

在封面下,Oracle仍会在双重语句上执行select,它只是语法糖(并且输入更少!)