动态复合语句

动态复合语句类似于 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;