动态复合语句
动态复合语句类似于 SQL 过程,只是它不需要创建永久对象。 例如,可以使用动态复合语句向脚本添加逻辑。
执行动态复合语句时,它具有创建,执行和删除程序的开销。 由于此开销,应该对需要频繁运行语句的情况使用 SQL 过程。 动态复合语句没有输入或输出参数; 您可以改为使用全局变量来传递输入值和返回值。
假设您有一个脚本需要设置一个包含常量值的表。 例如,您有一个表,该表针对一年中的每一天都有一行 (整数 1 到 366)。
CREATE TABLE day_numbers (day_value INT);
如果您不知道该表包含所有正确的值,那么需要删除所有行并再次插入这些行。 通过在脚本中引入复合 (动态) 语句,当已正确构建表时,无需重新填充该表。
BEGIN
DECLARE day_count INT;
DECLARE unique_day_count INT DEFAULT 0;
DECLARE insert_cnt INT;
DECLARE CONTINUE HANDLER FOR SQLSTATE VALUE '42704'
/* Handle table does not exist error */
CREATE TABLE day_numbers (day_value INT);
SELECT COUNT(DISTINCT day_value) , COUNT(day_value)
INTO unique_day_count, day_count
FROM day_numbers;
IF day_count = 366 AND unique_day_count = 366 THEN
BEGIN END; /* Table correctly populated */
ELSE
BEGIN
DELETE FROM day_numbers; /* Remove all rows */
SET insert_cnt = 1;
WHILE insert_cnt < 367 DO
INSERT INTO day_numbers VALUES insert_cnt;
SET insert_cnt = insert_cnt + 1;
END WHILE;
END;
END IF;
END;