2017-03-18 104 views
0

我必须使用此触发器才能在插入Oracle数据库之前检查电子邮件。代码中有错误,但我无法找到它。任何人都知道我可以修复它吗?我知道我可以使用一个简单的约束,但在我的大学他们希望我使用这个。Oracle - 触发器错误

create or replace TRIGGER email_check 
BEFORE INSERT 
ON CLIENTS 
REFERENCING NEW AS NEW OLD AS OLD 
FOR EACH ROW 
DECLARE 
tmpVar NUMBER; 
TOTCOUNT NUMBER; 
FIND1 NUMBER:= 0; 
FIND2 NUMBER:= 0; 

BEGIN 
tmpVar:= 0; 

SELECT CLIENT_SEQ.NEXTVAL INTO tmpVar 
From dual; 
:NEW.CLIENT_ID := tmpVar; 

FIND1 := INSTR(:NEW.EMAIL,'@',1,1); 
FIND2 := INSTR(:NEW.EMAIL,'.',1,1); 

IF FIND1 > 0 AND FIND2 > 0 THEN * NEW.CLIENT_ID := CLIENT_SEQ.NEXTVAL 
ELSE 
RAISE_APPLICATION_ERROR(-20101,'Mail Address Problem'); 
END IF; 

回答

2

语法错误固定:

  • 添加缺少END在端
  • 参阅如:OLD,的:NEW代替OLDNEW
  • 除去*字符本后THEN
  • 加入;完成语句里面IF

其他变化:

  • 省略select from dual声明。
  • 更改为直接使用CLIENT_SEQ.NEXTVAL而不是拨打电话两次。
  • 删除变量tmpVar,因为它不再需要。
  • 去除其他变量和直接使用表达式

试试这个:

create or replace TRIGGER email_check 
BEFORE INSERT 
ON CLIENTS 
REFERENCING NEW AS NEW OLD AS OLD 
FOR EACH ROW 
BEGIN 
IF INSTR(:NEW.EMAIL,'@',1,1) > 0 AND INSTR(:NEW.EMAIL,'.',1,1) > 0 THEN 
    :NEW.CLIENT_ID := CLIENT_SEQ.NEXTVAL; 
ELSE 
    RAISE_APPLICATION_ERROR(-20101,'Mail Address Problem'); 
END IF; 
END; 
+0

是现在的作品谢谢!在我的语法错误旁边,是什么问题?触发器是错误的? – NikosL24

+0

@ NikosL24 - 我提到了答案中所做的所有更改。 – GurV

+0

如果instr(:new.email,'@',1,1)> 0和instr(:new.email,'。',1,1)> 0'只是一个精心设计的版本if: new.email比如'%[email protected]_%._%''? (这实际上更彻底,因为'.''等应该被拒绝。) –