2015-02-10 75 views
0

我想這樣的CREATE TRIGGER,如果學生有上述成績這樣 上另一列得分會自動插入值(字母)MySQL的觸發IF語句錯誤(不會產生)

DELIMITER | 
    CREATE TRIGGER N_Angka BEFORE INSERT ON nilai 
    FOR EACH ROW 
    BEGIN 
     IF nilai_angka <= 50 THEN 
       UPDATE nilai SET NEW.nilai_huruf = 'C-'; 
      ELSE IF nilai_angka < 55 THEN 
       UPDATE nilai SET NEW.nilai_huruf = 'C'; 
      ELSE IF nilai_angka < 59 THEN 
       UPDATE nilai SET NEW.nilai_huruf = 'C+'; 
      ELSE IF nilai_angka <= 60 THEN 
       UPDATE nilai SET NEW.nilai_huruf = 'B-'; 
      ELSE IF nilai_angka < 75 THEN 
       UPDATE nilai SET NEW.nilai_huruf = 'B'; 
      ELSE IF nilai_angka <= 80 THEN 
       UPDATE nilai SET NEW.nilai_huruf = 'B+'; 
      ELSE IF nilai_angka <= 85 THEN 
       UPDATE nilai SET NEW.nilai_huruf = 'A-'; 
      ELSE IF nilai_angka <= 90 THEN 
       UPDATE nilai SET NEW.nilai_huruf = 'A'; 
      ELSE IF nilai_angka <= 99 THEN 
       UPDATE nilai SET NEW.nilai_huruf = 'A+'; 
      ELSE 
       UPDATE nilai SET NEW.nilai_huruf = 'S'; 
      END IF; 
    END | 
    DELIMITER ; 

它說,有在第26行錯誤是在

END IF; 

有人可以解釋,對我

+0

什麼錯誤? – 2015-02-10 19:42:58

+0

我不知道它說的是第26行的錯誤 END IF; 請幫助我。 – RedHatSource 2015-02-10 19:54:47

回答

1

不能使用提供一些解決方案0,但可以根據​​設置NEW.nilai_huruf的值,因爲它是BEFORE觸發器。

使用CASE表達式使其更加簡潔。

由於它現在是一個語句觸發器,因此不再需要使用BEGIN...END塊。

CREATE TRIGGER N_Angka 
BEFORE INSERT ON nilai 
FOR EACH ROW 
    SET NEW.nilai_huruf = CASE 
    WHEN NEW.nilai_angka <=50    THEN 'C-' 
    WHEN NEW.nilai_angka BETWEEN 51 AND 54 THEN 'C' 
    WHEN NEW.nilai_angka BETWEEN 55 AND 58 THEN 'C+' 
    WHEN NEW.nilai_angka BETWEEN 59 AND 60 THEN 'B-' 
    WHEN NEW.nilai_angka BETWEEN 61 AND 74 THEN 'B' 
    WHEN NEW.nilai_angka BETWEEN 75 AND 80 THEN 'B+' 
    WHEN NEW.nilai_angka BETWEEN 81 AND 85 THEN 'A-' 
    WHEN NEW.nilai_angka BETWEEN 86 AND 90 THEN 'A' 
    WHEN NEW.nilai_angka BETWEEN 91 AND 99 THEN 'A+' 
    ELSE 'S' END; 

這裏是一個SQLFiddle演示


您很可能希望創建一個免費的BEFORE UPDATE觸發。 在這一點上是有意義的邏輯提取到一個功能

CREATE FUNCTION angka_huruf(_angka INT) 
RETURNS VARCHAR(2) DETERMINISTIC 
RETURN CASE 
    WHEN _angka <=50    THEN 'C-' 
    WHEN _angka BETWEEN 51 AND 54 THEN 'C' 
    WHEN _angka BETWEEN 55 AND 58 THEN 'C+' 
    WHEN _angka BETWEEN 59 AND 60 THEN 'B-' 
    WHEN _angka BETWEEN 61 AND 74 THEN 'B' 
    WHEN _angka BETWEEN 75 AND 80 THEN 'B+' 
    WHEN _angka BETWEEN 81 AND 85 THEN 'A-' 
    WHEN _angka BETWEEN 86 AND 90 THEN 'A' 
    WHEN _angka BETWEEN 91 AND 99 THEN 'A+' 
    ELSE 'S' END; 

,然後再用它在這兩個觸發

CREATE TRIGGER N_Angka 
BEFORE INSERT ON nilai 
FOR EACH ROW 
    SET NEW.nilai_huruf = angka_huruf(NEW.nilai_angka); 

CREATE TRIGGER N_Angka2 
BEFORE UPDATE ON nilai 
FOR EACH ROW 
    SET NEW.nilai_huruf = angka_huruf(NEW.nilai_angka); 

這裏是一個SQLFiddle演示


現在,或者你可以溝渠觸發器和nilai_huruf列完全使用函數whenev呃,你取你的記錄

SELECT nilai_angka, angka_huruf(nilai_angka) nilai_huruf 
    FROM nilai; 

下面是一個SQLFiddle演示

+0

感謝peterm的答案,但我已經解決了這個問題 我改變事件的觸發器後 – RedHatSource 2015-02-18 00:19:39

0
DELIMITER $$ 
CREATE TRIGGER N_Angka BEFORE INSERT ON nilai 
FOR EACH ROW 
BEGIN 
    IF NEW.nilai_angka <= 50 THEN 
      BEGIN 
       SET NEW.nilai_huruf = 'C-'; 
       END; 
     ELSEIF NEW.nilai_angka < 55 THEN 
      BEGIN 
       SET NEW.nilai_huruf = 'C'; 
       END; 
     ELSEIF NEW.nilai_angka < 59 THEN 
      BEGIN 
       SET NEW.nilai_huruf = 'C+'; 
       END; 
     ELSEIF NEW.nilai_angka <= 60 THEN 
      BEGIN 
       SET NEW.nilai_huruf = '-B'; 
       END; 
     ELSEIF NEW.nilai_angka < 75 THEN 
      BEGIN 
       SET NEW.nilai_huruf = 'B'; 
       END; 
     ELSEIF NEW.nilai_angka <= 80 THEN 
      BEGIN 
      SET NEW.nilai_huruf = 'B+'; 
       END; 
     ELSEIF NEW.nilai_angka <= 85 THEN 
      BEGIN 
      SET NEW.nilai_huruf = 'A-'; 
       END; 
     ELSEIF NEW.nilai_angka <= 90 THEN 
      BEGIN 
      SET NEW.nilai_huruf = 'A'; 
       END; 
     ELSEIF NEW.nilai_angka <= 99 THEN 
      BEGIN 
      SET NEW.nilai_huruf = 'A+'; 
       END; 
     ELSEIF NEW.nilai_angka = 100 THEN 
      BEGIN 
      SET NEW.nilai_huruf = 'S'; 
       END; 
       END IF; 
END$$ 
DELIMITER ; 

這就是答案 我改變事件的觸發