2015-01-08 2 views
0

복합 문을 작성할 수 있습니까? -mysql?은 mysql에 복합 문을 작성하는 데 도움이 필요합니다.

그것은처럼 나에게 오류를 반환 : 여기

도와주세요

[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE n INT unsigned DEFAULT 0; 
    DECLARE i INT unsigned DEFAULT 0; 
    DECL' at line 40 

Sombody 것은 내가 사용하고있는 쿼리입니다

........................................... 
    IF(tarif='LT') 
    THEN 

    CREATE TABLE costSlabs SELECT `Start`,`End`,Cost FROM energy_slabs where SiteId=NEW.SiteID and `Start` < totalUnits; 
    DECLARE n INT DEFAULT 0; 
    DECLARE i INT DEFAULT 0; 
    DECLARE newStart INT; 
    DECLARE newEnd INT; 
    DECLARE newCost DOUBLE; 
    DECLARE finalCost DOUBLE DEFAULT 0; 

    SELECT COUNT(*) FROM costSlabs INTO n; 
    SET i=0; 
    WHILE i<n DO 
    SELECT `Start`, `End`,Cost INTO newStart,newEnd,newCost FROM costSlabs LIMIT i,1 ; 

IF(newEnd<totalUnits) 
THEN 
SET finalCost = finalCost + ((newEnd-newStart) * newCost); 

ELSE 
........................................... 

답변

0

IF 문의 컨텍스트 내에서 유효합니다 MySQL 저장 프로그램 (저장 프로 시저, 함수 또는 트리거). MySQL에 저장된 프로그램의 컨텍스트 외부에서는 유효한 SQL 문이 아닙니다.

우리는 NEW라는 이름의 테이블이나 테이블 별칭없이 SQL SELECT에서 NEW.에 대한 참조를 실시하고이를 근거로이 문장의 문맥을보고 있지만하고,이 SQL의 컨텍스트에 있다고 가정합니다 CREATE TRIGGER 성명

발생한 문제는 세미콜론 구분 기호로 인해 발생하는 것으로 보입니다. 세미콜론 구분 기호는 실제로 CREATE TRIGGER 문을 끝냅니다. 세미콜론 문자를 포함하는 트리거를 만들려면 다른 명령문 구분 기호를 지정해야합니다. 예를 들어 :

DELIMITER $$ 

CREATE TRIGGER mytrig 
BEFORE INSERT ON mytable 
FOR EACH ROW 
BEGIN 
    SET NEW.col1 = 'foo'; 
    SET NEW.col2 = 'bar'; 
END$$ 

DELIMITER ; 

첫 번째 문은 $$가 문을 종료 구분 기호로 사용되도록 지정합니다. 이 세트를 사용하면 $$ 분리 문자가 나올 때까지 다음 명령문을 단일 명령문으로 함께 읽습니다. 그러면 명령문이 끝나고 명령문이 실행될 수 있습니다. 이것은 기본적으로 트리거 본문 내의 세미콜론이 조기에 문을 "끝내는"것을 방지합니다.

문이 완료되면 구분 기호를 세미콜론으로 다시 변경할 수 있습니다.

질문에 게시 된 SQL 텍스트 블록 자체는 유효하지 않습니다. 나는 문법 오류가 CREATE TRIGGER 문장의 실행에서 반환되었다고 의심하지만 결론은 질문에 충분한 문맥이 없기 때문에 추측이다.

또한, 나는 MySQL의 저장 프로그램 내에서 (예 : 트리거로)의 DECLARE의 모든 문장은 CREATE TABLE 같은 전에 다른 문을 표시해야한다고 생각합니다.

+0

답장을 보내 주셔서 감사합니다. 그러나 오류가 표시됩니다. [Err] 1422 - 명시 적 또는 암시 적 커밋은 내장 함수 또는 트리거에서 허용되지 않습니다. 어떤 아이디어 ..? – user1844105

+0

'CREATE TABLE' 문과 같은 DDL 문은 암시 적 커밋을 발생시킵니다. 이것은 트리거의 컨텍스트에서 허용되지 않습니다. 트리거의 디자인에는 몇 가지 다른 중요한 문제가 있습니다. 'SELECT ... LIMIT i, 1'시리즈를 반복하는 것은 비효율적입니다. order by 절이 없으므로 리턴 될 행은 결정적이지 않습니다 (해당 SELECT 문을 실행할 때마다 항상 동일한 행이 반환 될 수 있으며 spec 내에 있어야합니다. 그 전체 혼란은 커서 루프로 대체되어야합니다. 'totalUnits'에 대한 참조가 있지만 어디에도 선언되어 있지 않습니다. – spencer7593

+0

우리는이 방아쇠가 무엇을하고 있는지, 최종 결과가 무엇인지를 알 수 없습니다. 그것이 무엇이든,이 방아쇠는 그것을 잘못하고 있습니다. – spencer7593

관련 문제