如何在oracle中使用触发器

如何在oracle中使用触发器,oracle,database-trigger,Oracle,Database Trigger,我创建了一个触发器,但我不知道如何使用它。 有人能帮我吗 create or replace trigger user_id_trigger before insert on library_user for each row begin if :new.user_id is null then select USER_ID_O_SE

我创建了一个触发器,但我不知道如何使用它。 有人能帮我吗

create or replace trigger user_id_trigger
              before insert on library_user
              for each row
              begin
                  if :new.user_id is null then
                      select USER_ID_O_SEQ.nextval into :new.user_id from library_user;
                 end if;
end;

create table LIBRARY_USER(      USER_ID number (20) primary key not null,
                                FIRST_NAME varchar (50) not null,
                                LAST_NAME varchar (50) not null,
                                USER_BDATE date not null,
                                USER_ADRESS varchar (200) not null,
                                USER_EMAIL varchar (50) not null,
                                USER_PHONE_NUMBER varchar (25),
                                USER_STATUS varchar (20) not null,
                                USERNAME varchar (50) not null,
                                PASSWORD varchar (50) not null);

在“选择”而不是“库”中使用双精度:

CREATE OR REPLACE TRIGGER user_id_trigger
    BEFORE INSERT
    ON library_user
    FOR EACH ROW
BEGIN
    IF :new.user_id IS NULL
    THEN
        SELECT user_id_o_seq.NEXTVAL INTO :new.user_id FROM dual;
    END IF;
END;
我不记得哪个版本允许您跳过select(我想是11.2),但在最近的Oracle版本中,您可以使用:

CREATE OR REPLACE TRIGGER user_id_trigger
    BEFORE INSERT
    ON library_user
    FOR EACH ROW
BEGIN
    :new.user_id   := COALESCE( :new.user_id, user_id_o_seq.NEXTVAL );
END;

对不起,这不是一个教程网站。oracle文档是一个很好的资源。当应用程序在
library\u user
表中插入一行时,触发器将触发。但是,您将得到一个错误,因为行级触发器无法查询定义它的表。您可能希望从
dual
中进行选择,或者直接从序列中分配
:new.user_id
,假设您使用的是Oracle的最新版本。此外,
select
将返回与您从中选择的表中的行数相同的行数(即序列nextval),因此,即使不是
library\u user
(参见Justin的评论),您也会得到
太多的行
,因为您无法将那么多的值放入
:new.user\u id
。回答你的问题:你不必做任何事情来使用它;在表中插入一行后,Oracle将立即使用它。当然,失败了(因为您被告知的一切)。在我看来,您似乎在尝试为数据库表
LIBRARY\u USER
USER\u ID
列分配一个默认值。有很多方法可以不用触发器来实现。可能的方法取决于您使用的Oracle数据库版本。对不起,我在你的帖子里找不到那个细节。