linux系统下无法创建mysql存储过程问题
来源:互联网 发布:神奇宝贝坂木老大知乎 编辑:程序博客网 时间:2024/06/05 10:43
创建存储过程的完整命令:
CREATE PROCEDURE pro1()
begin
declare b int default 0;
end;
mysql中运行存储过程创建语句错误结果:
root@db1>CREATE PROCEDUREpro1()
-> begin
-> declare b int default 0;
ERROR 1064 (42000): You havean error in your SQL syntax; check the manual that corresponds to your MySQLserver version for the right syntax to use near '' at line 3
root@db1>end;
mysql 默认把分号做为命令执行的结束标识符号。在创建存储过程命令中当遇见declare b int default 0;语句中的分号时,mysql解释器立即执行declare b int default 0;及其之前的语句,所以报语法错误。
我们可以使用delimiter命令来改变mysql 命令执行结束符。
root@db1>delimiter $
root@db1>CREATE PROCEDUREpro1()
-> begin
-> declare b int default 0;
-> end;
-> $
Query OK, 0 rows affected(0.00 sec)
root@db1>delimiter ;
MySql中delimiter的作用是什么?
这个命令与存储过程没什么关系吧。
其实就是告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了。
默认情况下,delimiter是分号;。在命令行客户端中,如果有一行命令以分号结束,
那么回车后,mysql将会执行该命令。如输入下面的语句
mysql> select * from test_table;
然后回车,那么MySQL将立即执行该语句。
但有时候,不希望MySQL这么做。在为可能输入较多的语句,且语句中包含有分号。
如试图在命令行客户端中输入如下语句
mysql> CREATE FUNCTION `SHORTEN`(S VARCHAR(255), N INT)
mysql> RETURNS varchar(255)
mysql> BEGIN
mysql> IF ISNULL(S) THEN
mysql> RETURN '';
mysql> ELSEIF N<15 THEN
mysql> RETURN LEFT(S, N);
mysql> ELSE
mysql> IF CHAR_LENGTH(S) <=N THEN
mysql> RETURN S;
mysql> ELSE
mysql> RETURN CONCAT(LEFT(S, N-10), '...', RIGHT(S, 5));
mysql> END IF;
mysql> END IF;
mysql> END;
默认情况下,不可能等到用户把这些语句全部输入完之后,再执行整段语句。
因为mysql一遇到分号,它就要自动执行。
即,在语句RETURN '';时,mysql解释器就要执行了。
这种情况下,就需要事先把delimiter换成其它符号,如//或$$。
mysql> delimiter //
mysql> CREATE FUNCTION `SHORTEN`(S VARCHAR(255), N INT)
mysql> RETURNS varchar(255)
mysql> BEGIN
mysql> IF ISNULL(S) THEN
mysql> RETURN '';
mysql> ELSEIF N<15 THEN
mysql> RETURN LEFT(S, N);
mysql> ELSE
mysql> IF CHAR_LENGTH(S) <=N THEN
mysql> RETURN S;
mysql> ELSE
mysql> RETURN CONCAT(LEFT(S, N-10), '...', RIGHT(S, 5));
mysql> END IF;
mysql> END IF;
mysql> END;//
这样只有当//出现之后,mysql解释器才会执行这段语句
例子:
mysql> delimiter //
mysql> CREATE PROCEDURE simpleproc (OUT param1 INT)
-> BEGIN
-> SELECT COUNT(*) INTO param1 FROM t;
-> END;
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> CALL simpleproc(@a);
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @a;
+------+
| @a |
+------+
| 3 |
+------+
1 row in set (0.00 sec)
执行完成后 要还原 ,执行 delimiter ;
- linux系统下无法创建mysql存储过程问题
- linux系统下无法创建mysql存储过程问题
- Linux系统下无法创建mysql账号
- mysql无法创建存储过程
- MySQL:在命令行下创建 MySQL 存储过程问题
- MySQL:在命令行下创建 MySQL 存储过程有关问题
- mysql无法创建存储过程(stored procedure
- Linux系统下永久解决mysql存储中文问题
- mysql 创建存储过程权限问题
- linux中mysql如何创建存储过程
- mysql创建存储过程
- mysql创建存储过程
- mysql创建存储过程
- mysql创建存储过程
- mysql创建存储过程
- mysql存储过程创建
- mysql创建存储过程
- mysql创建存储过程
- 如何构建一个高效的敏捷团队
- java与mysql乱码的问题
- H - Sum---(2015 summer training #12(Team_Qualifying))
- Java I/O
- 数据结构实验之求二叉树后序遍历和层次遍历
- linux系统下无法创建mysql存储过程问题
- cmake 生成 CodeBlocks 配置
- TiXml使用详解
- 吸血鬼日记第七季
- spring_jar包的详解
- Java 四大域对象总结
- Java连接MySQL中文乱码处理
- 国际象棋跳马程序(自编码研究)
- 如何写一个简单的linux驱动