MySQL儲存過程中使用動態SQL與靜態SQL的區別
阿新 • • 發佈:2019-02-19
儲存過程中使用動態SQL 例項
[sql] view plain copy
print?
DELIMITER $$ DROP PROCEDURE IF EXISTS `test`.`t1`$$ CREATE /** [DEFINER = { user | CURRENT_USER }]*/ PROCEDURE `test`.`t1`() /*LANGUAGE SQL | [NOT] DETERMINISTIC | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER } | COMMENT 'string' */ BEGIN SET @i = 3; SET @j = 5; -- 設立動態SQL SET @SQL = 'select * from `t1` limit ?,?'; -- 載入動態SQL PREPARE STMT FROM @SQL; -- 執行動態SQL EXECUTE STMT USING @i,@j; END$$ DELIMITER ;
儲存過程中未使用動態SQL 例項,靜態sql 的limit 的變數必須是用decare 宣告的才行
[sql] view plain copy
print?
DELIMITER $$ DROP PROCEDURE IF EXISTS `test`.`t2`$$ CREATE /** [DEFINER = { user | CURRENT_USER }]*/ PROCEDURE `test`.`t2`() /*LANGUAGE SQL | [NOT] DETERMINISTIC | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER } | COMMENT 'string' */ BEGIN -- 如果不使用動態SQL,那麼變數必須通過declare進行定義,才能在select語句中使用。 DECLARE i INT DEFAULT 0; DECLARE j INT DEFAULT 0; SET i = 3; SET j = 5; SELECT * FROM t1 LIMIT i,j; END$$ DELIMITER ;
如果不定義,會報如下錯誤:
[html] view plain copy
print?
DELIMITER $$ DROP PROCEDURE IF EXISTS `test`.`t3`$$ CREATE /** [DEFINER = { user | CURRENT_USER }]*/ PROCEDURE `test`.`t3`() /*LANGUAGE SQL | [NOT] DETERMINISTIC | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER } | COMMENT 'string' SET @i = 3; SET @j = 5; SET @sql = 'select * from `t1` limit ?,?'; PREPARE STMT FROM @sql; EXECUTE STMT USING @i,@j; */ BEGIN SET @i = 3; SET @j = 5; SELECT * FROM t1 LIMIT @i,@j; END$$ DELIMITER ;
執行後,報錯如下:
(0 row(s) affected, 1 warning(s))
Execution Time : 00:00:00:281
Transfer Time : 00:00:01:045
Total Time : 00:00:01:326
Error Code : 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 ‘@i,@j;
END’ at line 18
Execution Time : 00:00:00:000
Transfer Time : 00:00:00:000
Total Time : 00:00:00:000