存储过程和触发器,mysql 存储过程 及 触发器 学习笔记

存储过程
一个存储过程包括名字,参数列表,以及可以包括很多SQL语句的SQL语句集。
在这里对局部变量,异常处理,循环控制和IF条件句有新的语法定义。
下面是一个包括存储过程的实例声明:
CREATE PROCEDURE procedure1 /* name 存储过程名*/
(IN parameter1 INTEGER) /* parameters 参数*/
BEGIN /* start of block 语句块头*/
DECLARE variable1 CHAR(10); /* variables变量声明 */
IF parameter1 = 17 THEN /* start of IF IF条件开始*/
SET variable1 = 'birds'; /* assignment 赋值*/
ELSE
SET variable1 = 'beasts'; /* assignment 赋值*/
END IF; /* end of IF IF结束*/
INSERT INTO table1 VALUES (variable1);/* statement SQL语句*/
END /* end of block 语句块结束*/
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> deiimiter ;
这样只有当//出现之后,mysql解释器才会执行这段语句
记得 最后 加上 deiimiter ;
delimiter 后面不要加上分号;为结束符 例: delimiter //; 这样其实是设置结束符为 "//;" delimiter语句后面不需要加结束符.
下面这些对MySQL 5.0来说全新的语句,在过程体中是非法的:
CREATE PROCEDURE, ALTER PROCEDURE, DROP PROCEDURE, CREATE FUNCTION,
DROP FUNCTION, CREATE TRIGGER, DROP TRIGGER. 不过你可以使用
"CREATE PROCEDURE db5.p1 () DROP DATABASE db5//",
但是类似"USE database"语句也是非法的,因为MySQL假定默认数据库就是过程的工作场所。也就是说 存储过程 创建的前提是 你已经 use databasename; 就是已经选择了数据库.
调用存储过程
call prosedurename(); //不管有没有参数 括号不能省略
延伸 创造存储过程 他只依赖创建时的系统环境 例
delimiter //
use mao //
drop procedure if exist ptest //
set sql_mode = 'ansi'// //设置程序检查模式为 宽松模式 这样 可以来保证大多数SQL符合标准SQL的语法,这样在不同数据库之间迁移时,不需要对业务修改太多.
create procedure ptest()
begin
select 'a'||'b'; //此时 程序检查模式为宽松模式 所以|| 符号把连接二个字符串 如果模式为严格模式 则不会连接 但不会出错 只是结果为0 已测试.
end //
set sql_mode =''// //将检查模式设置为默认及严格模式
这时 虽然模式已经修改回来了 但是当我们
call ptest()// 时它返回的查询结果为 'ab'
结论为存储过程 运行的环境 是当初创建的环境 不会随而后的更改而更改
Parameter 参数
1. CREATE PROCEDURE p5
() ...
2. CREATE PROCEDURE p5
([IN] name data-type) ...
3. CREATE PROCEDURE p5
(OUT name data-type) ...
4. CREATE PROCEDURE p5
(INOUT name data-type) ...
回忆一下前面讲过的参数列表必须在存储过程名后的括号中。上面的第一个例子中的参数列表是空的,第二个例子中有一个输入参数。这里的词IN可选,因为默认参数为IN(input)。第三个例子中有一个输出参数,第四个例子中有一个参数,既能作为输入也可以作为输出。
Tags:  存储过程触发器 触发器与存储过程 存储过程和触发器

延伸阅读

最新评论

发表评论