Dans la console mysql, nous utiliserons la commande delimiter pour changer le délimiteur et il est utile de définir les procédures. J'ai compris la commande delimiter
uniquement pour le client mysql (commande côté client).
mais j'utilise le client mysql qui n'a pas la commande delimiter
comme dbslayer
, sur ce type de clients comment puis-je définir les procédures.
considérer pour l'instant:
create procedure test_pro()
begin
select 'hello pro';
end
J'ai essayé ce qui suit:
mysql -u root -pmypass test < proc_file
où proc_file contient la procédure ci-dessus;
mais cela me donne l'erreur suivante:
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3
Événement, j'ai essayé ce qui suit
create procedure test_pro()
begin
select 'hello pro';
end;
(a ajouté le point-virgule de fin) mais j'obtiens la même erreur.
Idem que je vis avec le dbslayer
, si je suis en mesure de définir la procédure ci-dessus via le terminal, je pense que je devrais pouvoir le faire via le dbslayer
Il n'y a pas moyen de contourner cela. Vous devez utiliser la commande DELIMITER
. Pourquoi ?
Si vous effectuez jamais un mysqldump des procédures stockées, chaque procédure stockée commence par
DELIMITER ;;
et se termine par
DELIMITER ;
Voici un article où j'en ai déjà parlé: DROP PROCEDURE IF EXISTS non inclus dans mysqldump
Essayez de vider une procédure stockée avec mysqldump et voyez par vous-même
J'ai également écrit du code pour ce faire:
Quant à la réponse posté par @ altmannmarcelo , il répond directement à votre question (+1 pour sa réponse). Sinon, mysqldumps ne pourrait jamais restaurer les procédures stockées.
Il y a deux choses que vous pouvez faire pour accueillir un nouveau DELIMITER:
Donnez le délimiteur sur la ligne de commande elle-même
mysql -u root -pmypass --delimiter="//" test < myproc.sql
Il s'agit d'une option de ligne de commande pour le programme client mysql
[root@****]# mysql --help | grep -i delimiter
--delimiter=name Delimiter to be used.
delimiter ;
Vous pouvez écrire le code dans un fichier texte et l'exécuter par rapport au fichier texte comme @ altmannmarcelo suggéré
echo "DELIMITER //" > myproc.sql
echo "create procedure test_pro()" >> myproc.sql
echo "begin" >> myproc.sql
echo "select 'hello pro';" >> myproc.sql
echo "end" >> myproc.sql
echo "//" >> myproc.sql
mysql -u root -pmypass test < myproc.sql
Vous devez modifier le délimiteur pour créer une procédure, sinon MySQL tentera de valider votre requête sur select 'hello pro';
Changez votre procédure en:
DELIMITER //
create procedure test_pro()
begin
select 'hello pro';
end
//
De Documentation MySQL :
Si vous utilisez le programme client mysql pour définir un programme stocké contenant des points-virgules, un problème se pose. Par défaut, mysql reconnaît lui-même le point-virgule comme un délimiteur d'instruction, vous devez donc redéfinir temporairement le délimiteur pour que mysql transmette l'intégralité de la définition du programme stocké au serveur.
Cela a fonctionné pour moi:
Contenu de mysqlfile.sql
USE `dbschemaname`;
DROP procedure IF EXISTS `myprocname`;
DELIMITER $$
USE `dbschemaname`$$
CREATE DEFINER=`myusername`@`%` PROCEDURE `myprocname`(IN myvar VARCHAR(3500))
BEGIN
DECLARE my_id INT;
SELECT id INTO veh_id FROM mytable WHERE something = myvar;
END$$
DELIMITER ;
et sur la ligne de commande:
$ mysql -u user -pmypass dbschemaname < mysqlfile.sql
Je sais que c'est une vieille question, mais ce qui suit pourrait être utile pour quelqu'un à l'avenir:
#!/bin/bash
echo "Started ..."
date
Host=localhost
user=dbusername
password=dbpassword
database=databasename
time /usr/bin/mysql --Host=$Host --user=$user --password=$password --database=$database<<EOFMYSQL
DELIMITER $$
create procedure test_pro()
BEGIN
SELECT 'hello pro';
END$$
DELIMITER ;
SHOW WARNINGS;
SHOW COUNT(*) WARNINGS;
EOFMYSQL
echo "Finished "
date
Testé et travaillant contre Maria DB.
Une fois terminé, vous pouvez simplement appeler la procédure en utilisant:
call test_pro();
J'espère que cela pourra aider :)