在mysql的基础知识中,唯存储过程有点难度。在mysql的官方网站看中文的帮助手册,其中的mysql存储过程一章,实在看不下去。翻译的真烂。还把数据库的专业术语”存储过程”翻译为”存储程序”,看起来非常的别扭。但作为一个学习者,还是得硬着头皮看一些。
为什么使用存储过程:
在我看来,它确实是实现了sql语句与应用程序的分享,使得一些操作被封装起来,方便修改与调用。另外在安全性,完整性方面也有一定的作用。mysql的存储过程在5.0中被实现。
怎样创建mysql的存储过程:
要想创建存储过程,你得具有权限:CREATE ROUTINE(ALTER ROUTINE和EXECUTE权限被自动授予它的创建者)。
一些说明:
存储过程首先是基于具体的数据库,所以在创建存储过程时,得使用use dbname来指定一个数据库。我们可以引用其它库里的存储过程:call test.p(),如果一个数据库被删除,显然里面所定义的存储过程也将被删除。具体细节,后文指出。
如何调用存储过程:
call 过程名
下面来看看一个实例,使用存储过程来计算两个数的乘积:
mysql> delimiter // -- 定义分隔符,默认为分号";"
mysql> create procedure px_multiply(a double,b double) -- 使用procedure关键字指示px_multiply为存储过程
-> begin -- 主体以begin开始,以end结束
-> declare c double; -- 使用declare定义一个局部变量
-> if a is null then -- 判断变量a是否有值
-> set a=0; -- 如果a为空,则初始化a=0
-> end if; -- if语句结束
-> if b is null then -- 同上
-> set b=0;
-> end if;
-> set c=a*b; -- 定义并初始化c为变量a,b 之间的乘积
-> select c as mul; -- 别名为mul
-> end; -- begin 块结束
-> // -- 存储过程创建结束标志
Query OK, 0 rows affected (0.08 sec)
mysql> delimiter ; -- 恢复分隔符标志为";"
mysql> call px_multiply(10,30); --使用call来调用存储过程,这时a=10,b=30
+------+
| mul |
+------+
| 300 |
+------+
1 row in set (0.02 sec)
Query OK, 0 rows affected (0.02 sec)
mysql> call px_multiply(102,3);
+------+
| mul |
+------+
| 306 |
+------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.01 sec)
解析说明:”MySQL中存储过程的建立以关键字create procedure开始,后面紧跟存储过程的名称和参数。MySQL的存储过程名称不区分大小写,例如PROCE1()和proce1()代表同一个存储过程名。存储过程名不能与MySQL数据库中的内建函数重名。
存储过程的参数一般由3部分组成。第一部分可以是in、out或inout。in表示向存储过程中传入参数;out表示向外传出参数;inout表示定义的参数可传入存储过程,并可以被存储过程修改后传出存储过程,存储过程默认为传入参数,所以参数in可以省略。第二部分为参数名。第三部分为参数的类型,该类型为MySQL数据库中所有可用的字段类型,如果有多个参数,参数之间可以用逗号进行分割。”
一些补充:
show procedure status –查看所有的存储过程的信息
show procedure status like ‘px_multiply’ — 查看某个存储过程的状态信息,可以知道它被定义在那个数据库中。
show create procedure px_multiply — 查看存储过程的创建
总算是了解到mysql中关于存储过程一点知识了,总不至于对此完全茫然。
参考:
http://dev.mysql.com/doc/refman/5.1/zh/stored-procedures.html
http://www.ccvita.com/100.html http://www.cnblogs.com/hsqzzzl/archive/2008/02/21/1076646.html http://linux.chinaunix.net/techdoc/database/2009/07/18/1124969.shtml
本来想写一篇关于shell中的I/O重定向总结性的文章发到CU的shell版,但梳理了下思路,觉得对文件描述符也只是一知半解,为了不给别人增加阅读上的负担或知识上的误人子弟,就小写一篇发到自己的博客吧。如果你不小心通过搜索引擎看到此篇,还请指教和包涵。
文件描述符,在linux系统中,为了跟踪进程所打开的文件,对每个打个的文件分配一个非负数的整数给它。文件描述符保存了关于这个文件的所有信息。在linux系统中我们可以通过lsof来查看具体的信息。在shell中,默认会分配10(0-9)文件描述符,而默认的0(标准输入) 1(标准输出) 2(标准错误输出)。所谓的标准输入就是我们的键盘,而标准输出和标准错误输出,通常就是指屏幕。当然我们能改变这种情况,可以从文件中读取信息,可以把命令的输出到文件中。这就叫重定向。总而言之,重定向就是改变了默认的输入/输出的方式。
为了说明这种现象,我们来看ABS中一段脚本:
#!/bin/bash E_FILE_ACCESS=70 E_WRONG_ARGS=71 if [ ! -r "$1" ];then echo "Can't read from input file!" echo "Usage:$0 input-file ouput-file." exit $E_FILE_ACCESS fi if [ -z "$2" ];then echo "Need to specify oput file." exit $E_WRONG_ARGS fi exec 4<&0 #保存默认的标准输入到文件描述符4 exec < $1 #指定从脚本的第一个参数读取 exec 7>&1 #保存标准输出到文件描述符7 exec > $2 #指定标准输出为脚本的第二个参数 cat - | tr a-z A-Z exec 1<&7 7>&- #恢复默认的标准输出及关闭文件描述符7 exec 0<&4 4<&- #恢复默认的标准输入及关闭文件描述符4 exit 0
解说:以上脚本的功能就是从脚本的第一个参数中读取(而非从键盘读取),经过tr的转换后把输出发送到脚本第二个参数所指定的地方(而非发送到屏幕)。