2010-07-05 3 views
0

무엇이 오류입니까?트리거에서 변수를 선언하고 mysql과 함께 사용하는 방법은 무엇입니까?

DELIMITER $$ 

CREATE TRIGGER `Task_insert_trig` AFTER INSERT ON `task` 
FOR EACH ROW 
begin 
declare userID int; 

Set userID =(select userID from assigned_task where Atk_Task_Id = new.Tsk_Id and Atk_Project_Id = new.Tsk_Project_Id); 
insert into dashboard_event set 
Dsh_Project_Id = new.Tsk_Project_Id, 
Dsh_Actor = userID, 
Dsh_Action = 'Assign', 
Dsh_Type = 'Task', 
Dsh_Target = new.Tsk_Id, 
Dsh_Date = now(); 
$$ 
end 
DELIMITER ; 

오류 코드 : 1064 당신은 당신의 SQL 구문에 오류가 있습니다 ; 근처의 '12'근처에서 사용할 올바른 구문에 대해서는 MySQL 서버 버전에 해당하는 설명서를 확인하십시오.

오류 코드 : 1064 SQL 구문에 오류가 있습니다. 근처 사용할 수있는 권리 구문에 대한 MySQL 서버 버전에 해당하는 설명서를 확인 라인 1

답변

2

에서 ' DELIMITER 끝'나는 $$ end delimiter;이 정확하지 않은 오류가 $$ 구분에 관계가 있었다 생각합니다. 또한, 테이블 열 (예 : assigned_task 테이블의 userID)과 혼동 될 수있는 변수 이름을 사용하지 않을 것입니다. 또한 삽입 구문이 손상되었습니다. (업데이트 : 실제로 삽입이 잘되고, 알지 못했습니다. 당신이) 그런 식으로 할 수

여기에 주제에 내 모든 연구 결과의

DELIMITER $$ 
CREATE TRIGGER Task_insert_trig AFTER INSERT ON task FOR EACH ROW 
begin 

Set @userID =(select userID from assigned_task where Atk_Task_Id = new.Tsk_Id and Atk_Project_Id = new.Tsk_Project_Id limit 1); 
insert into dashboard_event 
(Dsh_Project_Id , Dsh_Actor , Dsh_Action , Dsh_Type , Dsh_Target , Dsh_Date) 
values 
(new.Tsk_Project_Id, @userID, 'Assign', 'Task', new.Tsk_Id, now()); 

end $$ 
DELIMITER ; 
1

시도해보십시오.

는 "당신은 BE 필요

이 수동에서 인용 한 것입니다 프로 시저에 둘 이상의 명령.이 있으면 GIN/END 블록. 이 블록을 사용하여 여러 문장을 묶습니다.

하지만 그게 전부는 아닙니다. 은/END를 BEGIN 블록은 또한 변수와 제어의 흐름을 정의 할 수있는 장소입니다, 복합 문을 소위 "즉

:.

(이 규칙의 절차를 트리거에 적용하고 저장하는 표시 동일한 방식으로 양쪽 모두에서 같은 구문이 사용됩니다.)

먼저 IF ... END IF 또는 WHILE ... END WHILE과 같은 키워드의 흐름 제어 그룹이 단일 성명서는 세미콜론으로 끝나는 한, 즉 끝 부분에 세미콜론으로 전체적으로 끝난다. IF IF END ...; END WHILE ... ENDY;

그런 다음 트리거 또는 저장 프로 시저의 본문에 단 하나의 스테이먼트 만 있고 해당 문이 변수 선언 또는 위와 같은 키워드의 흐름 제어 그룹이 아닌 경우 해당 문은 세미콜론 (;)으로 종료되지 않고 BEGIN ... END 블록으로 묶습니다.

반대로 트리거 또는 저장 프로 시저의 본문에 둘 이상의 스테이 멘트가 포함되어 있고 특히 변수 선언 및/또는 키워드 흐름 제어 그룹이 포함되어있는 경우에는 BEGIN ...으로 묶어야합니다. END 블록.

마지막으로 BEGIN ... END 블록 자체는 세미콜론으로 끝나지 않아야합니다.

희망이는 $$ 전에 수

2

END 요구를하는 데 도움이됩니다.

이것은 MySql 5.5에서 작동합니다.이 fiddle에 28을 지정하면 구분 기호는 |입니다.

중요한 점은 가독성을 위해 코드를 정리하는 것이 좋습니다. 중요한 문제는 아니지만 일부 키워드는 대문자로, 일부는 아니고, 일부는``, 일부는 아니며, 들여 쓰기가 없습니다.

는 개인적으로도 일의 전체 이름을 선호 - 작업 대신 쯧 등 의 어느 곳에서나 너무 전체 단어가 더 명확하게 될 때 약어를 볼 때 정말 나쁜 가져옵니다. 희롱.

CREATE TABLE assigned_task (
    Atk_Task_Id INT NOT NULL, 
    Tsk_Project_Id INT NOT NULL); 

CREATE TABLE dashboard_event (
    Dsh_Project_Id INT NOT NULL, 
    Dsh_Actor INT NOT NULL, 
    Dsh_Action CHAR(100) NOT NULL, 
    Dsh_Type CHAR(100) NOT NULL, 
    Dsh_Target INT NOT NULL, 
    Dsh_Date DATETIME); 

CREATE TABLE Task (
    Tsk_Id INT NOT NULL, 
    Tsk_Project_Id INT NOT NULL); 

CREATE TRIGGER Task_insert_trig AFTER INSERT ON Task 
    FOR EACH ROW BEGIN 

    SET @userID = (
    SELECT userID 
    FROM assigned_task 
    WHERE Atk_Task_Id = new.Tsk_Id 
     AND Atk_Project_Id = new.Tsk_Project_Id 
    LIMIT 1); 

    INSERT INTO dashboard_event (
    Dsh_Project_Id, 
    Dsh_Actor, 
    Dsh_Action, 
    Dsh_Type, 
    Dsh_Target, 
    Dsh_Date) 
    VALUES (
    new.Tsk_Project_Id, 
    @userID, 
    'Assign', 
    'Task', 
    new.Tsk_Id, 
    NOW()); 
END 
관련 문제