Как создать хранимую процедуру mysql через терминал linux

9

В консоли mysql мы будем использовать команду delimiter для изменения разделителя, и полезно определить процедуры. Я понял команду delimiterтолько для клиента mysql (команда на стороне клиента).

но я использую клиент mysql, у которого нет такой команды, delimiter как dbslayerна таких клиентах, как я могу определить процедуры.

а пока рассмотрим:

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

Я попробовал следующее:

mysql -u root -pmypass  test < proc_file

где proc_file содержит вышеуказанную процедуру;

но это дает мне следующую ошибку:

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

Событие я попробовал следующее

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

(добавил точку с запятой), но получаю ту же ошибку.

То же самое я испытываю с тем dbslayer, что , если я могу определить вышеописанную процедуру через терминал, я думаю, что я смогу сделать это черезdbslayer

neotam
источник

Ответы:

10

Обойти это невозможно. Вы должны использовать DELIMITERкоманду. Почему ?

Если вы выполняете mysqldump хранимых процедур, каждая хранимая процедура начинается с

DELIMITER ;;

и заканчивается

DELIMITER ;

Вот пост, в котором я упоминал об этом раньше: ПРОЦЕДУРА УДАЛЕНИЯ, ЕСЛИ СУЩЕСТВУЕТ В mysqldump

Попробуйте сбросить одну хранимую процедуру с помощью mysqldump и убедитесь сами

Я также написал код для этого:

Что касается ответа, опубликованного @altmannmarcelo , то он прямо отвечает на ваш вопрос (+1 за его ответ). В противном случае mysqldumps никогда не сможет восстановить хранимые процедуры.

Есть две вещи, которые вы можете сделать, чтобы приспособить нового РАЗДЕЛИТЕЛЯ:

ПОПРОБУЙТЕ ЭТО # ​​1

Дайте разделитель в самой командной строке

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

Это опция командной строки для клиентской программы mysql

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

ПОПРОБУЙТЕ ЭТО № 2

Вы можете записать код в текстовый файл и выполнить его в соответствии с предложенным @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

ДАЙТЕ ЭТО ПОПРОБУЙТЕ !!!

RolandoMySQLDBA
источник
3

Вам нужно изменить разделитель для создания процедуры, иначе MySQL попытается зафиксировать ваш запрос на select 'hello pro';

Измените вашу процедуру на:

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

Из документации MySQL :

Если вы используете клиентскую программу mysql для определения хранимой программы, содержащей точки с запятой, возникает проблема. По умолчанию mysql сам распознает точку с запятой как разделитель операторов, поэтому вы должны временно переопределить разделитель, чтобы mysql передал полное определение хранимой программы на сервер.

altmannmarcelo
источник
Я знаю об этом разделителе в консоли MySQL. Я ищу другую вещь. Я спросил, как создать процедуру без входа в консоль mysql. Если мы выполняем как mysql -u root -ppass db -e "выберите somecolumn from testtable", если мы выполним указанную выше команду на терминале linux, мы получим результат для запроса, указанного после -e. после выполнения запроса он отключится. Дело в том, что в этом запросе разделитель // работать не будет.
neotam
Как говорит @RolandoMySQLDBA (+1), вы можете либо сохранить процедуру в файл, DELIMITERлибо изменить ее, передав аргумент --delimiterв mysqlкомандной строке.
altmannmarcelo
2

Это сработало для меня:

Содержимое 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 ;

и в командной строке:

$ mysql -u user -pmypass dbschemaname < mysqlfile.sql
user38380
источник
0

Я знаю, что это старый вопрос, но в будущем кому-то может пригодиться:

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

Проверено и работает против Марии Д.Б.

После завершения вы можете просто вызвать процедуру, используя:

call test_pro();

Надеюсь, это поможет :)

просто я
источник