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

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


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.


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

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.