web-dev-qa-db-fra.com

Est-il possible d'exécuter une chaîne de caractères dans MySQL?

Je dois convertir un proc stocké MSSQL qui passe une varchar qui est une requête:

INSERT INTO Results
  EXEC (@Expresion);

Ça ne marche pas. Je suis à peu près sûr que EXEC et EXECUTE ne sont pas des commandes MySQL, mais CALL ne fonctionne pas non plus.

Est-ce que quelqu'un sait s'il est même possible d'avoir quelque chose comme la fonction eval de JavaScript pour MySQL?

21
DJTripleThreat

EXECUTE est une commande valide dans MySQL. Manuel de référence MySQL

14
Brandon Bodnar

Je pense que vous cherchez quelque chose comme ça:

SET @queryString = (
SELECT CONCAT('INSERT INTO user_group (`group_id`,`user_id`) VALUES ', www.vals) as res FROM (
    SELECT GROUP_CONCAT(qwe.asd SEPARATOR ',') as vals FROM ( 
           SELECT CONCAT('(59,', user_id, ')') as asd FROM access WHERE residency = 9 
    ) as qwe 
) as www
);

PREPARE stmt FROM @queryString;
EXECUTE stmt;
DEALLOCATE PREPARE stmt; 
SET @asd = NULL;
14
Tengiz

Ceci est l'équivalent SQL de eval(my_string);:

@Expression = 'SELECT "Hello, World!";';
PREPARE myquery FROM @Expression;
EXECUTE myquery;

Fondamentalement, j'ai combiné les réponses existantes, sans que je ne vous dise comment faire eval exactement.


Si vous voulez ajouter des paramètres, vous pouvez utiliser ceci:

@username = "test";
@password = "asdf";
@Expression = 'SELECT id FROM Users WHERE name = ? AND pass = ?;'
PREPARE myquery FROM @Expression;
EXECUTE myquery USING @username, @password;

Et pour répondre exactement à la question initiale:

@Expression = 'SELECT "Hello, World!";'
PREPARE myquery FROM @Expression;
INSERT INTO Results
  EXECUTE myquery;

Notez que l'instruction PREPARE ... FROM demande une variable de session (préfixée par @). Si vous essayez de passer une variable normale, elle lèvera les mains en l'air et ne s'en souciera tout simplement pas.

9
Luc

La commande EXECUTE MySQL ne peut être utilisée que pour une instruction préparée.

Si vous souhaitez exécuter plusieurs requêtes à partir de la chaîne, envisagez de les enregistrer dans un fichier et de les rechercher, par exemple.

SET @query = 'SELECT 1; SELECT 2; SELECT 3;';
SELECT @query INTO OUTFILE '/tmp/temp.sql';
SOURCE /tmp/temp.sql;
1
kenorb