Come creare una stored procedure mysql tramite il terminale Linux


9

Nella console mysql useremo il comando delimitatore per modificare il delimitatore ed è utile definire le procedure. Ho capito il comando delimitersolo per il client mysql (comando lato client).

ma sto usando il client mysql che non ha il comando delimiter simile dbslayer, su questo tipo di client come posso definire le procedure.

per ora considera:

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

Ho provato quanto segue:

mysql -u root -pmypass  test < proc_file

dove proc_file contiene la procedura sopra descritta;

ma questo mi sta dando il seguente errore:

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

Evento ho provato quanto segue

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

(aggiunto il punto e virgola finale) ma sto ottenendo lo stesso errore.

Lo stesso che sto vivendo con il dbslayer, se sono in grado di definire la procedura di cui sopra tramite il terminale penso che dovrei essere in grado di farlo attraverso ildbslayer

Risposte:


10

Non c'è modo di aggirarlo. È necessario utilizzare il DELIMITERcomando Perché ?

Se si esegue mai un mysqldump delle stored procedure, ogni stored procedure inizia con

DELIMITER ;;

e termina con

DELIMITER ;

Ecco un post in cui ho già parlato di questo: PROCEDURA DROP SE ESISTE non incluso in mysqldump

Prova a scaricare una procedura memorizzata con mysqldump e vedi di persona

Ho anche scritto del codice per fare questo:

Per quanto riguarda la risposta inviata da @altmannmarcelo , risponde direttamente alla tua domanda (+1 per la sua risposta). Altrimenti, mysqldumps non potrebbe mai ripristinare le stored procedure.

Ci sono due cose che puoi fare per ospitare un nuovo DELIMITER:

PROVA QUESTO # 1

Dare il delimitatore sulla riga di comando stessa

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

È un'opzione della riga di comando per il programma client mysql

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

PROVA QUESTO # 2

È possibile scrivere il codice in un file di testo ed eseguire il file di testo come suggerito da @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

PROVACI !!!


3

È necessario modificare il delimitatore per creare una procedura, altrimenti MySQL proverà a eseguire il commit della query select 'hello pro';

Cambia la tua procedura in:

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

Dalla documentazione di MySQL :

Se si utilizza il programma client mysql per definire un programma memorizzato contenente caratteri punto e virgola, si verifica un problema. Per impostazione predefinita, mysql riconosce il punto e virgola come delimitatore di istruzioni, quindi è necessario ridefinire temporaneamente il delimitatore per fare in modo che mysql passi al server l'intera definizione del programma memorizzato.


Sono a conoscenza di questo delimitatore nella console mysql. Sto cercando cose diverse. Ho chiesto come creare una procedura senza accedere alla console mysql. Se eseguiamo come mysql -u root -ppass db -e "seleziona una colonna da testtable" se eseguiamo il comando sopra sul terminale Linux otterremo il risultato per la query specificata dopo -e. si disconnetterà dopo aver eseguito la query, il fatto è che in quella query il delimitatore // non funzionerà.
neotam,

Come dice @RolandoMySQLDBA (+1), puoi salvare la procedura in un file DELIMITERo cambiarla passando l'argomento --delimitersulla mysqlriga di comando.
altmannmarcelo,

2

Questo ha funzionato per me:

Contenuto di 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 ;

e dalla riga di comando:

$ mysql -u user -pmypass dbschemaname < mysqlfile.sql

0

So che questa è una vecchia domanda, ma in futuro potrebbe essere utile per qualcuno:

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

Testato e funzionante contro Maria DB.

Al termine puoi semplicemente chiamare la procedura usando:

call test_pro();

Spero che aiuti :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.