Search code examples
mysqlif-statementstored-procedureslocal-variablesdeclare

Nested if-statement in MySQL


I am making a procedure that inserts a place ("Sted") and I would like to check if the inputs are NULL. However, whenever I try to add an if-statement at the start to surround my code (marked CRASH below), it gives me an error saying my syntax is not right at "DECLARE varStedskodeID INT;" which is the part after the IF-statement I'm trying to add.

To my eyes the syntax of my if-statement is the same inside the code, but only my soon-to-be-NULL-check if-statement crashes even with just a simple IF(TRUE) THEN.

Can anyone give me a hint of what causes this one if to crash?

DROP PROCEDURE IF EXISTS InsertSted;
DELIMITER $$
CREATE PROCEDURE InsertSted(
    IN inputStedsnavn VARCHAR(255),
    IN inputStedstype VARCHAR(255),
    IN inputKommunenavn VARCHAR(255))
BEGIN
    IF(TRUE) THEN <<------ CRASH

        DECLARE varStedskodeID INT;
        DECLARE varKommunenr INT;

        IF(SELECT COUNT(StedkodeID) FROM stedstype WHERE Kodenavn = inputStedstype LIMIT 1) = 0 THEN
            INSERT INTO stedstype VALUES(DEFAULT, inputStedstype);
        END IF;
        SET varStedskodeID = (SELECT StedkodeID FROM stedstype WHERE Kodenavn = inputStedstype LIMIT 1);

        IF(SELECT COUNT(Kommunenr) FROM kommune WHERE Kommunenavn = inputKommunenavn LIMIT 1) = 1 THEN
            SET varKommunenr = (SELECT Kommunenr FROM kommune WHERE Kommunenavn = inputKommunenavn LIMIT 1);
            INSERT INTO sted VALUES(DEFAULT, inputStedsnavn, varStedskodeID, varKommunenr);
        END IF;

    END IF; <<------ CRASH
END$$
DELIMITER ;

Solution

  • DECLARE is permitted only inside a BEGIN ... END compound statement and must be at its start, before any other statements.

    http://dev.mysql.com/doc/refman/5.0/en/declare.html

    MySQL follows strict rules for DECLARE. You have to DECLARE variables, tables, etc... at the beginning of Stored Procedure.

    Change Stored Procedure like this

    DECLARE varStedskodeID INT;
     DECLARE varKommunenr INT;
    IF(TRUE) THEN 
    
            IF(SELECT COUNT(StedkodeID) FROM stedstype WHERE Kodenavn = inputStedstype LIMIT 1) = 0 THEN
                INSERT INTO stedstype VALUES(DEFAULT, inputStedstype);
            END IF;
            SET varStedskodeID = (SELECT StedkodeID FROM stedstype WHERE Kodenavn = inputStedstype LIMIT 1);
    
            IF(SELECT COUNT(Kommunenr) FROM kommune WHERE Kommunenavn = inputKommunenavn LIMIT 1) = 1 THEN
                SET varKommunenr = (SELECT Kommunenr FROM kommune WHERE Kommunenavn = inputKommunenavn LIMIT 1);
                INSERT INTO sted VALUES(DEFAULT, inputStedsnavn, varStedskodeID, varKommunenr);
            END IF;
    
    END IF;