MariaDB Compound Statements Outside Stored Procedures

It’s always been a small annoyance that the MySQL / MariaDB flavour of SQL wouldn’t allow you to use if else logic or loops outside of a stored procedure or trigger. There were ways around  this but it’s not as nice if you’re coming from TSQL. This is rectified in MariaDB from 10.1.1.

One thing that is worth noting, which perhaps the manual doesn’t make totally clear, is that you should use the DELIMITER statement in your SQL code. This is just the same as when writing stored procedures. You get syntax error if you don’t do this.

DELIMITER |
BEGIN NOT ATOMIC
 
/* SQL CODE HERE
*/
 
END; |
 
DELIMITER ;

Here are a few examples;

UPDATE: Please note that the source code plugin strips the pipe characters from the code after you click “View Code”

WHILE LOOP

DELIMITER |
 
BEGIN NOT ATOMIC
	DECLARE i INTEGER;
	SET i = 1;
 
	WHILE i < 10 DO
 
		SELECT i;
		SELECT SLEEP(i);
		SET i = i + 1;
 
	END WHILE;
 
END; |
 
DELIMITER ;

IF STATEMENT

DELIMITER |
 
BEGIN NOT ATOMIC
 
	IF 1 = 1 THEN
		SELECT 'Hello, World!';
	END IF;
 
END; |
 
DELIMITER ;

CASE STATEMENT

DELIMITER |
 
BEGIN NOT ATOMIC
 
	CASE(@@port)
		WHEN 3306 THEN
		SELECT 'Running on the default port.';
	ELSE
		SELECT 'You are not running on the default port.';
	END CASE;
 
END; |
 
DELIMITER ;

ITERATE LOOP WITH IF ELSE

DELIMITER |
 
BEGIN NOT ATOMIC
 
	DECLARE i INTEGER DEFAULT 0;
 
	my_loop: LOOP
		SET i = i + 1;
		SELECT i * i;
		IF i < 10 THEN 
			ITERATE my_loop;
		ELSE
			LEAVE my_loop;
		END IF;
	END LOOP my_loop;
END; |
 
DELIMITER ;

Leave a Reply