2012-01-15 4 views
1

내가 절차 VOTES_COUNT를 사용하는 DB2 트리거를 만들려고 해요하지만 트리거를 만들려고 할 때 오류 얻을 :DB2 트리거 정의

CREATE PROCEDURE VOTES_COUNT (IN username VARCHAR(15), OUT votesCount INT) 
DYNAMIC RESULT SETS 1 

P1: BEGIN 

DECLARE C1 CURSOR FOR 
    SELECT COUNT(*) AS R1 
     FROM VOTES 
     WHERE USER = username; 
OPEN C1;  
FETCH C1 INTO votesCount; 
CLOSE C1; 

END P1 @ 

CREATE TRIGGER UPDATE_LEVEL 
AFTER INSERT ON VOTES 
REFERENCING NEW AS N 
FOR EACH ROW 
BEGIN ATOMIC 
    DECLARE num INT; 
    DECLARE status INT; 
    CALL VOTES_COUNT(N.USERNAME, num); 
    CASE 
     WHEN num >= 300 
      THEN SET status = 5; 
     WHEN num < 300 AND num >= 200 
      THEN SET status = 4; 
     WHEN num < 200 AND num >= 100 
      THEN SET status = 3; 
     WHEN num < 100 AND num >= 50 
      THEN SET status = 2; 
     ELSE 
      SET status = 1; 
    END CASE; 
    UPDATE USERS SET STATUS = status WHERE USERNAME = N.USERNAME; 
END @ 
: 여기

An unexpected token "" was found following "". Expected tokens may include: "SET status = 1".. SQLCODE=-104, SQLSTATE=42601, DRIVER=4.7.89

내 코드의를

내가 뭘 잘못하고 있는지 말해 줄 수 있니?

답변

1

당신은 저장 프로 시저없이이 작업을 수행 할 수 있습니다

CREATE TRIGGER UPDATE_LEVEL 
AFTER INSERT ON VOTES 
REFERENCING NEW AS N 
FOR EACH ROW MODE DB2SQL 
BEGIN ATOMIC 
    DECLARE votesCount INT; 
    DECLARE userStatus INT;  
    SET votesCount = (SELECT COUNT(*) 
    FROM USERS 
    WHERE USERNAME = N.USERNAME); 

    IF votesCount >= 300 THEN 
     SET userStatus = 5; 
    ELSEIF votesCount < 300 AND votesCount >= 200 THEN 
     SET userStatus = 4; 
    ELSEIF votesCount < 200 AND votesCount >= 100 THEN 
     SET userStatus = 3; 
    ELSEIF votesCount < 100 AND votesCount >= 50 THEN 
     SET userStatus = 2; 
    ELSE 
     SET userStatus = 1; 
    END IF; 

    UPDATE USERS SET STATUS = userStatus WHERE USERNAME = N.USERNAME; 
END @ 
+0

을 감사 WOW! 그건 완벽하게 작동합니다! –

+0

내가 도왔다 니 기쁩니다! 친애하는! –