Cómo crear un procedimiento almacenado mysql a través de la terminal de Linux

9

En la consola mysql usaremos el comando delimitador para cambiar el delimitador y es útil para definir los procedimientos. Entendí el comando delimitersolo para el cliente mysql (comando del lado del cliente).

pero estoy usando el cliente mysql que no tiene el comando delimiter como dbslayer, en este tipo de clientes, ¿cómo puedo definir los procedimientos?

por ahora considere:

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

Intenté lo siguiente:

mysql -u root -pmypass  test < proc_file

donde proc_file contiene el procedimiento anterior;

pero eso me está dando el siguiente error:

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 probé lo siguiente

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

(se agregó el punto y coma final) pero obtengo el mismo error.

Lo mismo que estoy experimentando con el dbslayer, si puedo definir el procedimiento anterior a través del terminal, creo que debería poder hacerlo a través deldbslayer

neotam
fuente

Respuestas:

10

No hay manera de evitarlo. Debes usar el DELIMITERcomando. Por qué ?

Si alguna vez realiza un mysqldump de los procedimientos almacenados, cada procedimiento almacenado comienza con

DELIMITER ;;

y termina con

DELIMITER ;

Aquí hay una publicación donde mencioné esto antes: PROCEDIMIENTO DE GOTA SI EXISTE no incluido en mysqldump

Intente descargar un procedimiento almacenado con mysqldump y vea por usted mismo

También escribí un código para hacer esto:

En cuanto a la respuesta publicada por @altmannmarcelo , responde directamente a su pregunta (+1 por su respuesta). De lo contrario, mysqldumps nunca podría restaurar los procedimientos almacenados.

Hay dos cosas que puede hacer para acomodar un nuevo DELIMITADOR:

PRUEBE ESTE # 1

Indique el delimitador en la línea de comando.

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

Es una opción de línea de comando para el programa cliente mysql

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

PRUEBE ESTE # 2

Puede escribir el código en un archivo de texto y ejecutarlo contra el archivo de texto como sugirió @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

DARLE UNA OPORTUNIDAD !!!

RolandoMySQLDBA
fuente
3

Debe cambiar el delimitador para crear un procedimiento; de lo contrario, MySQL intentará confirmar su consulta en select 'hello pro';

Cambie su procedimiento a:

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

De la documentación de MySQL :

Si usa el programa cliente mysql para definir un programa almacenado que contiene caracteres de punto y coma, surge un problema. De manera predeterminada, mysql reconoce el punto y coma como un delimitador de instrucciones, por lo que debe redefinir el delimitador temporalmente para que mysql pase toda la definición del programa almacenado al servidor.

altmannmarcelo
fuente
Soy consciente de este delimitador en la consola mysql. Estoy buscando algo diferente. Le pregunté cómo crear un procedimiento sin iniciar sesión en la consola mysql. Si actuamos como mysql -u root -ppass db -e "seleccione alguna columna de la tabla de prueba" si ejecutamos el comando anterior en el terminal de Linux obtendremos el resultado de la consulta especificada después de -e. se desconectará después de realizar la consulta. El hecho es que en esa consulta el delimitador // no funcionará.
neotam
Como @RolandoMySQLDBA dice (+1), puede guardar el procedimiento en un archivo DELIMITERo cambiarlo pasando el argumento --delimiteren la mysqllínea de comandos.
altmannmarcelo
2

Esto funcionó para mí:

Contenido 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 ;

y en la línea de comando:

$ mysql -u user -pmypass dbschemaname < mysqlfile.sql
usuario38380
fuente
0

Sé que esta es una vieja pregunta, pero lo siguiente podría ser útil para alguien en el futuro:

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

Probado y trabajando contra Maria DB.

Después de que termine, puede llamar al procedimiento usando:

call test_pro();

Espero que ayude :)

solo yo
fuente