2013-04-11 3 views
1

Я пытаюсь заполнить таблицу значениями из инструкции EXECUTE в хранимой процедуре. Есть ли способ выполнить это или что-то подобное.Выполнить инструкцию в предложении VALUES MYSQL

DELIMITER $$ 
DROP PROCEDURE IF EXISTS `mysql`.`ShowUserGrants` $$ 
CREATE PROCEDURE mysql.ShowUserGrants() 
BEGIN 
    DECLARE done BOOLEAN DEFAULT FALSE; 
    DECLARE strGrant CHAR(100); 
    DECLARE cur1 CURSOR 
     FOR SELECT CONCAT("SHOW GRANTS FOR '",user,"'@'",host,"';") 
      FROM mysql.user 
      WHERE host!='localhost'; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true; 

    OPEN cur1; 

    read_loop:LOOP 
    FETCH cur1 INTO strGrant; 
    IF done THEN 
    CLOSE Cur1; 
     LEAVE read_loop; 
    END IF; 
    SET @a = strGrant; 
    PREPARE strStmt FROM @a; 
    INSERT INTO user_grants (grants) VALUES(EXECUTE strStmt); 
/* EXECUTE strStmt; */ 
    DEALLOCATE PREPARE strStmt; 
    END LOOP; 

END $$ 
DELIMITER ; 

Операция EXECUTE работает так, как я хочу, но вам нужно заполнить таблицу user_grants. Спасибо.

+0

эта процедура будет работать на MySQL 5.0.51 и 5.1.61. Теперь я знаю, что EXECUTE staement нельзя использовать с INSERT. Поэтому возникает вопрос: как я могу выполнить то, что пытается выполнить хранимая процедура? –

ответ

1
DELIMITER $$ 

DROP PROCEDURE IF EXISTS `mysql`.`ShowUserGrants` $$ 

CREATE PROCEDURE mysql.ShowUserGrants() 
BEGIN 
    DECLARE done BOOLEAN DEFAULT FALSE; 
    DECLARE strGrant CHAR(100); 
    DECLARE cur1 CURSOR 

     FOR SELECT CONCAT("SHOW GRANTS FOR '",user,"'@'",host,"';") 
      FROM mysql.user 
      WHERE host!='localhost'; 

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true; 

    OPEN cur1; 

    read_loop:LOOP 

    FETCH cur1 INTO strGrant; 

    IF done THEN 
     CLOSE Cur1; 
     LEAVE read_loop; 
    END IF; 

    SET @a = 'INSERT INTO user_grants(grants) VALUES(?)'; 
    PREPARE strStmt FROM @a; 
    SET @var = strGrant; 
    EXECUTE strStmt USING @var; 
    DEALLOCATE PREPARE strStmt; 
    END LOOP; 
END $$ 

DELIMITER ; 

или лучше заменить зр тело

INSERT INTO user_grants(grants) 
    SELECT CONCAT("SHOW GRANTS FOR '",user,"'@'",host,"';") 
    FROM mysql.user 
    WHERE host!='localhost';