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


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

Answers:


10

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

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

DELIMITER ;;

并以

DELIMITER ;

这是我之前提到过的帖子:如果mysqldump中不存在,则执行DROP PRODEDURE

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

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

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

您可以执行以下两项操作来容纳新的DELIMITER:

试试这个#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

试试看 !!!


3

您需要更改定界符以创建过程,否则MySQL将尝试在以下位置提交查询 select 'hello pro';

将您的过程更改为:

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

MySQL文档

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


我知道mysql控制台中的此分隔符。我在寻找不同的东西。我问过如何在不登录mysql控制台的情况下创建过程。如果我们像mysql -u root -ppass db -e一样执行“从测试表中选择一个列”,如果我们在linux终端上执行上述命令,我们将得到-e之后指定查询的结果。它会在执行查询后断开连接,事实是该查询中的定界符//不起作用。
Neotam

就像@RolandoMySQLDBA说的(+1)一样,您可以将过程保存到一个文件中,DELIMITER也可以通过--delimitermysql命令行中传递参数来更改它。
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

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

经过测试并与Maria DB配合使用。

完成后,您可以使用以下命令调用该过程:

call test_pro();

希望有帮助:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.