2013-04-11 79 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和61年5月1日运行。我现在知道EXECUTE staement不能用于INSERT。所以问题就变成了:我怎样才能完成存储过程试图做的事情? – 2013-04-15 19:13:37

回答

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 ; 

或更好,更换SP机身采用

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