如何通过linux终端创建mysql存储过程

neo*_*tam 11 mysql stored-procedures

在 mysql 控制台中,我们将使用 delimiter 命令来更改分隔符,这对定义过程很有用。我 delimiter只了解 mysql 客户端的命令(客户端命令)。

但我使用不具有该命令的MySQL客户端delimiter 一样dbslayer,对这种客户我该怎么定义程序。

现在考虑:

create procedure test_pro()
begin
select 'hello pro';
end
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法:

mysql -u root -pmypass  test < proc_file
Run Code Online (Sandbox Code Playgroud)

其中 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
Run Code Online (Sandbox Code Playgroud)

事件我尝试了以下

 create procedure test_pro()
    begin
    select 'hello pro';
    end;
Run Code Online (Sandbox Code Playgroud)

(添加了尾随分号)但我得到了同样的错误。

我遇到了同样的问题dbslayer,如果我能够通过终端定义上述过程,我想我应该能够通过dbslayer

Rol*_*DBA 12

没有其他办法了。您必须使用该DELIMITER命令。为什么 ?

如果您曾经执行过存储过程的 mysqldump,每个存储过程都以

DELIMITER ;;
Run Code Online (Sandbox Code Playgroud)

并以

DELIMITER ;
Run Code Online (Sandbox Code Playgroud)

这是我之前提到的一篇文章:DROP PROCEDURE IF EXISTS not included in mysqldump

尝试使用 mysqldump 转储一个存储过程并亲自查看

我还写了一些代码来做到这一点:

至于@altmannmarcelo发布的答案,它直接回答了您的问题(他的回答为 +1)。否则,mysqldumps 永远无法恢复存储过程。

您可以做两件事来容纳新的 DELIMITER:

试试这个 #1

在命令行本身上给出定界符

mysql -u root -pmypass --delimiter="//" test < myproc.sql
Run Code Online (Sandbox Code Playgroud)

它是mysql客户端程序的命令行选项

[root@****]# mysql --help | grep -i delimiter
  --delimiter=name    Delimiter to be used.
delimiter                         ;
Run Code Online (Sandbox Code Playgroud)

试试这个 #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
Run Code Online (Sandbox Code Playgroud)

试一试 !!!


alt*_*elo 5

您需要更改分隔符以创建过程,否则 MySQL 将尝试提交您的查询 select 'hello pro';

将您的程序更改为:

DELIMITER //
create procedure test_pro()
begin
select 'hello pro';
end
//
Run Code Online (Sandbox Code Playgroud)

来自MySQL 文档

如果使用mysql客户端程序定义一个包含分号字符的存储程序,就会出现问题。默认情况下,mysql 本身将分号识别为语句分隔符,因此您必须临时重新定义分隔符,以使 mysql 将整个存储的程序定义传递给服务器。