1

ストアド プロシージャの 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 にデータを入力する必要があります。ありがとう。

4

1 に答える 1

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';
于 2013-05-11T16:57:08.313 に答える