Plsql 在PL/SQL oracle 9中创建触发器

Plsql 在PL/SQL oracle 9中创建触发器,plsql,Plsql,我正试图根据下面链接图片上的问题创建一个触发器。但我很难在更新时处理重复字符,在插入和更新时处理最大字符长度。这是我的解决办法 CREATE OR REPLACE TRIGGER check_author BEFORE UPDATE OR INSERT ON bk_author FOR EACH ROW DECLARE v_authorid bk_author.authorid%type; BEGIN IF UPDATING THEN IF LENGTH(:NEW.fname) > 10

我正试图根据下面链接图片上的问题创建一个触发器。但我很难在更新时处理重复字符,在插入和更新时处理最大字符长度。这是我的解决办法

CREATE OR REPLACE TRIGGER check_author
BEFORE UPDATE OR INSERT  ON bk_author
FOR EACH ROW
DECLARE
v_authorid bk_author.authorid%type;
BEGIN
IF UPDATING THEN
IF LENGTH(:NEW.fname) > 10 THEN
RAISE_APPLICATION_ERROR(-20004,'Author name cannot exceed 10 characters');
END IF;
ELSIF INSERTING THEN
SELECT authorid
INTO v_authorid
FROM bk_author
WHERE authorid = :NEW.authorid;
RAISE_APPLICATION_ERROR(-20003,'Author id already existing cannot be added');
IF LENGTH(:NEW.fname) > 10 THEN
RAISE_APPLICATION_ERROR(-20004,'Author name cannot exceed 10 characters');
END IF;

END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Author '||:NEW.authorid||' added');
END;
/

您不必检查条件以引发关于复制的错误,无论数据库中是否有ID,它都会执行

你应该在它前面加上IF

差不多

ELSIF INSERTING THEN
SELECT authorid
INTO v_authorid
FROM bk_author
WHERE authorid = :NEW.authorid;
IF v_authorid is not null then
    RAISE_APPLICATION_ERROR(-20003,'Author id already existing cannot be 
  added');
 end if;

试试下面的代码,它应该适合你

CREATE OR REPLACE TRIGGER check_author
BEFORE UPDATE OR INSERT  ON bk_author
FOR EACH ROW
DECLARE
v_authorid number;
BEGIN
IF UPDATING THEN
IF LENGTH(:NEW.fname) > 10 THEN
RAISE_APPLICATION_ERROR(-20004,'Author name cannot exceed 10 characters');
END IF;
ELSIF INSERTING THEN
SELECT count(authorid) INTO v_authorid
FROM bk_author
WHERE authorid = :NEW.authorid;

DBMS_OUTPUT.PUT_LINE('Author id already existing cannot be added');
RAISE;
IF LENGTH(:NEW.fname) > 10 THEN
DBMS_OUTPUT.PUT_LINE('Author name cannot exceed 10 characters');
RAISE;
END IF;

END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Author '||:NEW.authorid||' added');
END;
/

1.为什么使用触发器检查字段长度,而不使用约束或约束字段类型?需要吗?2.当您选择“已存在”时,您不会检查它是否存在。您可能会引发错误3。为什么不在检查更新插入之前检查长度(:NEW.fname)-以避免代码重复?1我使用触发器来回答我被问到的一个特殊的学校作业问题,如果超过字段最大长度,则引发应用程序错误。2.我没有使用现有的值和名称可以重复。如果存在,只需检查ID。3.在更新或插入之前,我将尝试检查长度,看看它是否无法工作,正如您所说。他使用否定确认来检查重复项,如果select没有找到任何内容,他将跳转到异常块以查找未找到的数据。您好,authorid现在似乎没有问题,我现在的挑战是名称最大长度验证,当我输入更长的名字时,我的触发器仍然不会引发异常。嗨,谢谢,我尝试了这个解决方案,当我尝试输入更长的名字时,触发器仍然不会触发。