2017-03-18 161 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]_%._%''? (這實際上更徹底,因爲'.''等應該被拒絕。) –