【问题标题】:Execute statement in VALUES clause MYSQL在 VALUES 子句 MYSQL 中执行语句
【发布时间】:2013-04-11 14:25:47
【问题描述】:

我正在尝试使用存储过程中 EXECUTE 语句中的值填充表。有没有办法执行这个或类似的事情。

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。 谢谢。

【问题讨论】:

  • 此程序将在 mysql 5.0.51 和 5.1.61 上运行。我现在知道 EXECUTE 语句不能与 INSERT 一起使用。所以问题就变成了:我怎样才能完成存储过程试图做的事情?

标签: mysql stored-procedures sql-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 ;

或者更好,用

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    相关资源
    最近更新 更多