web-dev-qa-db-fra.com

Comment créer une procédure stockée mysql via un terminal Linux

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

9
neotam

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:

ESSAYEZ CECI # 1

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                         ;

ESSAYEZ CECI # 2

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

ESSAIE !!!

10
RolandoMySQLDBA

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.

3
altmannmarcelo

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
2
user38380

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 :)

0
justMe