Como criar um procedimento armazenado mysql através do terminal linux

9

No console do mysql, usaremos o comando delimiter para alterar o delimitador e é útil definir os procedimentos. Eu entendi o comando delimiterapenas para o cliente mysql (comando do lado do cliente).

mas estou usando o cliente mysql que não possui o comando delimiter como dbslayer, neste tipo de clientes como posso definir os procedimentos.

por enquanto, considere:

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

Eu tentei o seguinte:

mysql -u root -pmypass  test < proc_file

onde proc_file contém o procedimento acima;

mas isso está me dando o seguinte erro:

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 Eu tentei o seguinte

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

(adicionado o ponto e vírgula à direita), mas estou recebendo o mesmo erro.

O mesmo que estou experimentando com o dbslayer, se eu sou capaz de definir o procedimento acima através do terminal, acho que devo ser capaz de fazê-lo através dodbslayer

neotam
fonte

Respostas:

10

Não há maneira de contornar isso. Você deve usar o DELIMITERcomando Por quê ?

Se você executar um mysqldump dos procedimentos armazenados, cada procedimento armazenado começará com

DELIMITER ;;

e termina com

DELIMITER ;

Aqui está um post onde mencionei isso antes: DROP PROCEDURE SE EXISTE não incluído no mysqldump

Tente despejar um procedimento armazenado com o mysqldump e veja por si mesmo

Também escrevi um código para fazer isso:

Quanto à resposta postada por @altmannmarcelo , ela responde diretamente à sua pergunta (+1 na resposta). Caso contrário, o mysqldumps nunca poderá restaurar os procedimentos armazenados.

Há duas coisas que você pode fazer para acomodar um novo DELIMITER:

Experimente este # 1

Forneça o delimitador na própria linha de comando

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

É uma opção de linha de comando para o programa cliente mysql

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

Experimente este # 2

Você pode escrever o código em um arquivo de texto e executá-lo no arquivo de texto, como sugeriu @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

DE UMA CHANCE !!!

RolandoMySQLDBA
fonte
3

Você precisa alterar o delimitador para criar um procedimento, caso contrário o MySQL tentará confirmar sua consulta em select 'hello pro';

Mude seu procedimento para:

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

Da documentação do MySQL :

Se você usar o programa cliente mysql para definir um programa armazenado contendo caracteres de ponto e vírgula, surgirá um problema. Por padrão, o próprio mysql reconhece o ponto e vírgula como um delimitador de instrução, portanto, você deve redefinir o delimitador temporariamente para fazer com que o mysql passe toda a definição de programa armazenada para o servidor.

altmannmarcelo
fonte
Estou ciente desse delimitador no console do mysql. Eu estou procurando algo diferente. Eu perguntei como criar um procedimento sem fazer login no console do mysql. Se executarmos como mysql -u root -ppass db -e "selecionar somecolumn from testtable" se executarmos o comando acima no terminal linux, obteremos o resultado para a consulta especificada após -e. ele será desconectado após executar a consulta. O fato é que, na consulta, o delimitador // não funcionará.
Neotam
Como o @RolandoMySQLDBA diz (+1), você pode salvar o procedimento em um arquivo DELIMITERou alterá-lo passando o argumento --delimiterna mysqllinha de comando.
Altmannmarcelo
2

Isso funcionou para mim:

Conteúdo do 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 na linha de comando:

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

Sei que essa é uma pergunta antiga, mas o seguinte pode ser útil para alguém no 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

Testado e trabalhando contra Maria DB.

Depois de concluído, basta chamar o procedimento usando:

call test_pro();

Espero que ajude :)

apenas eu
fonte