2013-03-06 2 views
4

У меня есть эта процедура:как использовать переменную в создании базы данных о

DELIMITER // 

create DEFINER = 'root'@'localhost' procedure create_db(name TEXT) 
BEGIN 
DECLARE temp TEXT; 
DECLARE user TEXT; 
SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = name INTO temp; 
    if temp = name then 
     SIGNAL SQLSTATE '45002' SET MESSAGE_TEXT = 'This database already exist'; 
    else 
     SELECT USER() INTO user; 
     create database name; 
     grant all privileges on name.* to user with grant option; 
    END IF; 
END // 

DELIMITER ; 

он прекрасно работает как раз это поставить буквально «имя» вместо значения имени переменной. Как я могу сказать, что имя является переменной? что-то вроде $ name в php или что. Я просматриваю многие документы, но все они используют переменную без префиксов.

ответ

4

Вам просто нужно использовать подготовленные заявления, вот рабочий код:

DELIMITER // 

drop procedure if exists create_db // 

create procedure create_db(name TEXT) 
BEGIN 
    DECLARE temp TEXT; 
    DECLARE user TEXT; 
    SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = name INTO temp; 
    if temp = name then 
    SIGNAL SQLSTATE '45002' SET MESSAGE_TEXT = 'This database already exist'; 
    else 
    SELECT USER() INTO user; 

    SET @s = CONCAT('CREATE DATABASE ', name); 
    PREPARE stmt_create FROM @s; 
    EXECUTE stmt_create; 
    DEALLOCATE PREPARE stmt_create; 

    SET @s = CONCAT('GRANT ALL PRIVILEGES ON ', name, '.* TO ', user, ' WITH GRANT OPTION'); 
    PREPARE stmt_grant FROM @s; 
    EXECUTE stmt_grant; 
    DEALLOCATE PREPARE stmt_grant; 

    END IF; 
END // 

DELIMITER ; 
Смежные вопросы