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

9

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 delimiteruniquement 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 genre 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 ledbslayer

neotam
la source

Réponses:

10

Il n'y a pas moyen de contourner cela. Vous devez utiliser la DELIMITERcommande. 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ù je l'ai mentionné auparavant: 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ée par @altmannmarcelo , elle 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 contre le fichier texte comme l' a suggéré @altmannmarcelo

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 !!!

RolandoMySQLDBA
la source
3

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 la documentation MySQL :

Si vous utilisez le programme client mysql pour définir un programme stocké contenant des points-virgules, un problème survient. Par défaut, mysql lui-même reconnaît 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.

altmannmarcelo
la source
Je connais ce délimiteur dans la console mysql. Je cherche autre chose. Je vous ai demandé comment créer une procédure sans vous connecter à la console mysql. Si nous effectuons comme mysql -u root -ppass db -e "sélectionnez une colonne de la table de test" si nous exécutons la commande ci-dessus sur le terminal linux, nous obtiendrons le résultat de la requête spécifiée après -e. il se déconnectera après avoir effectué la requête. Le fait est que dans cette requête, le délimiteur // ne fonctionnera pas.
neotam
Comme le dit @RolandoMySQLDBA (+1), vous pouvez soit enregistrer la procédure dans un fichier avec DELIMITERou le changer en passant l'argument --delimiteren mysqlligne de commande.
altmannmarcelo
2

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
user38380
la source
0

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

juste moi
la source