I have this sql file:
USE mydb;
DROP PROCEDURE IF EXISTS execSql;
DELIMITER //
CREATE PROCEDURE execSql (
IN sqlq VARCHAR(5000)
) COMMENT 'Executes the statement'
BEGIN
PREPARE stmt FROM sqlq;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END //
DELIMITER ;
When I try to run it with
# cat file.sql | mysql -p
I get
ERROR 1064 (42000) at line 6: 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 'sqlq;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END' at line 5
What am I doing wrong?
You can only prepare and execute SQL that's a string literal or a user-defined variable that contains the text of the statement.
Try this:
USE mydb;
DROP PROCEDURE IF EXISTS execSql;
DELIMITER //
CREATE PROCEDURE execSql (IN sqlq VARCHAR(5000)) COMMENT 'Executes the statement'
BEGIN
SET @sqlv = sqlq;
PREPARE stmt FROM @sqlv;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END //
DELIMITER ;
You can use CONCATENATE
, PREPARE
and EXECUTE
statements as bellow:
CREATE DEFINER=`products`@`localhost` PROCEDURE `generateMeritList`(
IN `mastercategory_id` INT(11),
IN `masterschools_id` INT(11)
) NO SQL
BEGIN
DECLARE total INT DEFAULT 0;
DECLARE conditions varchar(255) DEFAULT '';
DECLARE finalQuery varchar(60000) DEFAULT '';
IF mastercategory_id > 0 THEN
SET conditions = CONCAT(' AND app.masterschools_id = ', mastercategory_id);
END IF;
SET @finalQuery = CONCAT(
"SELECT *
FROM applications app
INNER JOIN masterschools school ON school.id = app.masterschools_id
WHERE app.status = 'active' ", conditions, " LIMIT ", total);
PREPARE stmt FROM @finalQuery;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With