So erstellen Sie eine gespeicherte MySQL-Prozedur über das Linux-Terminal

9

In der MySQL-Konsole verwenden wir den Befehl delimiter, um das Trennzeichen zu ändern, und es ist nützlich, die Prozeduren zu definieren. Ich habe den Befehl delimiternur für den MySQL-Client verstanden (clientseitiger Befehl).

aber ich bin mit dem MySQL - Client, der den Befehl nicht haben , delimiter wie dbslayer, auf diese Art von Kunden , wie kann ich die Verfahren festlegen.

für jetzt überlegen Sie:

create procedure test_pro()
begin
select 'hello pro';
end

Ich habe folgendes versucht:

mysql -u root -pmypass  test < proc_file

wobei proc_file die obige Prozedur enthält;

aber das gibt mir folgenden Fehler:

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

Event habe ich folgendes versucht

 create procedure test_pro()
    begin
    select 'hello pro';
    end;

(fügte das nachfolgende Semikolon hinzu), erhalte aber den gleichen Fehler.

Dasselbe erlebe ich mit dem dbslayer, wenn ich in der Lage bin, das obige Verfahren über das Terminal zu definieren, denke ich, dass ich das durch das Terminal tun solltedbslayer

Neotam
quelle

Antworten:

10

Daran führt kein Weg vorbei. Sie müssen den DELIMITERBefehl verwenden. Warum ?

Wenn Sie jemals einen mysqldump der gespeicherten Prozeduren ausführen, beginnt jede gespeicherte Prozedur mit

DELIMITER ;;

und endet mit

DELIMITER ;

Hier ist ein Beitrag, in dem ich dies bereits erwähnt habe: DROP PROCEDURE IF EXISTS nicht in mysqldump enthalten

Versuchen Sie, eine gespeicherte Prozedur mit mysqldump zu sichern, und überzeugen Sie sich selbst

Ich habe auch einen Code geschrieben, um dies zu tun:

Wie für die Antwort gepostet @altmannmarcelo , beantwortet sie direkt auf Ihre Frage (+1 für seine Antwort). Andernfalls könnten mysqldumps gespeicherte Prozeduren niemals wiederherstellen.

Es gibt zwei Möglichkeiten, um einen neuen DELIMITER unterzubringen:

VERSUCHEN SIE DIESE # 1

Geben Sie das Trennzeichen in der Befehlszeile selbst ein

mysql -u root -pmypass --delimiter="//" test < myproc.sql

Dies ist eine Befehlszeilenoption für das MySQL-Client-Programm

[root@****]# mysql --help | grep -i delimiter
  --delimiter=name    Delimiter to be used.
delimiter                         ;

VERSUCHEN SIE DIESES # 2

Sie können den Code in eine Textdatei schreiben und gegen die Textdatei ausführen, wie von @altmannmarcelo vorgeschlagen

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

VERSUCHE ES !!!

RolandoMySQLDBA
quelle
3

Sie müssen das Trennzeichen ändern, um eine Prozedur zu erstellen. Andernfalls versucht MySQL, Ihre Abfrage festzuschreiben select 'hello pro';

Ändern Sie Ihre Prozedur in:

DELIMITER //
create procedure test_pro()
begin
select 'hello pro';
end
//

Aus der MySQL-Dokumentation :

Wenn Sie das MySQL-Client-Programm verwenden, um ein gespeichertes Programm mit Semikolonzeichen zu definieren, tritt ein Problem auf. Standardmäßig erkennt mysql selbst das Semikolon als Anweisungsbegrenzer. Daher müssen Sie das Trennzeichen vorübergehend neu definieren, damit mysql die gesamte Definition des gespeicherten Programms an den Server übergibt.

altmannmarcelo
quelle
Mir ist dieses Trennzeichen in der MySQL-Konsole bekannt. Ich suche etwas anderes. Ich habe gefragt, wie man eine Prozedur erstellt, ohne sich bei der MySQL-Konsole anzumelden. Wenn wir wie mysql -u root -ppass db -e "select somecolumn from testtable" ausführen, wenn wir den obigen Befehl auf dem Linux-Terminal ausführen, erhalten wir das Ergebnis für die nach -e angegebene Abfrage. Nach der Durchführung der Abfrage wird die Verbindung getrennt. Tatsache ist, dass in dieser Abfrage das Trennzeichen // nicht funktioniert.
Neotam
Wie @RolandoMySQLDBA (+1) sagt, können Sie die Prozedur entweder in einer Datei speichern DELIMITERoder ändern, indem Sie das Argument --delimiterin der mysqlBefehlszeile übergeben.
Altmannmarcelo
2

Das hat bei mir funktioniert:

Inhalt von 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 ;

und auf der Kommandozeile:

$ mysql -u user -pmypass dbschemaname < mysqlfile.sql
user38380
quelle
0

Ich weiß, dass dies eine alte Frage ist, aber Folgendes könnte in Zukunft für jemanden nützlich sein:

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

Getestet und arbeitet gegen Maria DB.

Nachdem es fertig ist, können Sie die Prozedur einfach aufrufen mit:

call test_pro();

Ich hoffe, das hilft :)

nur ich
quelle