可以从变量名创建表吗?例如,我尝试编写以下存储过程,但它不会使用create语句编译过去。
CREATE DEFINER = 'sabretooth'@'%' PROCEDURE `sp_archive_sabretooth`(
IN vhost INTEGER(11),
IN record_age DATETIME,
IN delete_records BOOLEAN
)
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE i_exist BOOLEAN DEFAULT FALSE;
DECLARE table_to_create, backup_table_name, database_name VARCHAR(255);
DECLARE backup_tables_cursor CURSOR FOR
SELECT DISTINCT (INFORMATION_SCHEMA.COLUMNS.TABLE_NAME)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE (INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME LIKE 'vhost%'
OR
INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME = 'mid')
AND INFORMATION_SCHEMA.COLUMNS.TABLE_SCHEMA LIKE 'sabretooth%';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
INSERT INTO sabretooth.debug (message) VALUES (CONCAT('Initializing sp_archive_sabretooth; vhost = ', vhost, '; record age = ', record_age, '; delete_records = ', delete_records));
SELECT INFORMATION_SCHEMA.SCHEMATA.SCHEMA_NAME
INTO database_name
FROM INFORMATION_SCHEMA.SCHEMATA
WHERE INFORMATION_SCHEMA.SCHEMATA.SCHEMA_NAME LIKE 'sabretooth%'
AND INFORMATION_SCHEMA.SCHEMATA.SCHEMA_NAME <> 'sabretooth_archive';
OPEN backup_tables_cursor;
create_tables_loop: LOOP
FETCH backup_tables_cursor INTO table_to_create;
IF done THEN
LEAVE create_tables_loop;
END IF;
CREATE DATABASE IF NOT EXISTS sabretooth_archive;
SELECT CONCAT(database_name, '.', table_to_create,'_archive') INTO backup_table_name;
INSERT INTO sabretooth.debug (message) VALUES (CONCAT('I am here 38 backup_table_name = ',backup_table_name));
CREATE TABLE CONCAT('sabretooth_archive.',table_to_create) LIKE CONCAT(database_name,'.',table_to_create);
END LOOP;
END发布于 2012-03-05 17:16:13
您要寻找的是一个称为动态sql的概念。要做到这一点,您必须使用准备好的语句。幸运的是,MySQL许可证在存储过程中准备了语句,但没有存储函数或触发器。
而且,幸运的是,MySQL许可证准备了关于CREATE TABLE命令的语句。
因此,您必须准备CREATE TABLE,如下所示:
SET @SQL = CONCAT('CREATE TABLE ',CONCAT('sabretooth_archive.',table_to_create),' LIKE ',CONCAT(database_name,'.',table_to_create));
PREPARE stmt FROM @SQL;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;https://dba.stackexchange.com/questions/14397
复制相似问题