标签归档:存储过程

第一次写MySQL存储过程遇到的关于DELIMITER的问题

第一次写MySQL存储过程遇到的关于DELIMITER的问题
在很久很久以前写过Oracle的存储过程,昨天由于某些特殊的原因导致需要在MySQL中写一些存储过程,只能现学现用了
首先写了一个非常简单的存储过程,但是就是如此简单的过程也报错了,其代码如下:

1
2
3
4
5
 
CREATE PROCEDURE test()
BEGIN
    SELECT 'Hello Word!';                                                               
END

在phpmyadmin及客户端都报错,在phpmyadmin中显示:#1064 – 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

显然,程序在第一个分号后面出错了
原因不明,遂google之,找到如下地址:http://www.cnblogs.com/hsqzzzl/archive/2008/02/21/1076646.html
文章作者有说:分隔符是通知MySQL客户端已经输入完成的符号。一直都是用“;”,但是在存储过程中不行,因为存储过程中很多语句都需要用到分号
于是得到如下所示代码

1
2
3
4
5
6
DELIMITER ||
CREATE PROCEDURE test()
BEGIN
    SELECT 'Hello Word!';                              
END ||
DELIMITER ;

如果不想使用DELIMITER,在phpmyadmin中执行命令时,在Delimiter文本框中填写||

另在百度百科中有说明:http://baike.baidu.com/view/3068266.htm
MySQL中delimit命令。
  这个命令与存储过程没什么关系。
  其实就是告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了。
  即改变输入结束符。
  默认情况下,delimiter是分号“;”。
  在命令行客户端中,如果有一行命令以分号结束,
  那么回车后,mysql将会执行该命令。
  但有时候,不希望MySQL这么做。因为可能输入较多的语句,且语句中包含有分号。
  默认情况下,不可能等到用户把这些语句全部输入完之后,再执行整段语句。
  因为mysql一遇到分号,它就要自动执行。
  这种情况下,就可以使用delimiter,把delimiter后面换成其它符号,如//或$$。
  此时,delimiter作用就是对整个小段语句做一个简单的封装。
  此命令多用在定义子程序,触发程序等musql自己内嵌小程序中。

存储过程和触发器

存储过程和触发器

【存储过程的定义】
将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来, 那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。

【存储过程的优点】
1、更快的速度
存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2、代码重用,避免代码冗余
当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
开发人员进行数据库操作时,仅需要调用定义好的存储过程就可以了
3、提高安全性
一些敏感的数据直接在数据层完成,数据层可以对其进行权限控制,提高安全性

【触发器】
google得如下文章:
地址:http://fishermen.javaeye.com/blog/24026

触发器是一种特殊类型的存储过程,它不同于我们前面介绍过的存储过程。触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用。当对某一表进行诸如UPDATE、 INSERT、 DELETE 这些操作时,SQL Server 就会自动执行触发器所定义的SQL 语句,从而确保对数据的处理必须符合由这些SQL 语句所定义的规则。
触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。除此之外,触发器还有其它许多不同的功能:
【 强化约束 Enforce restriction】
触发器能够实现比CHECK 语句更为复杂的约束。

【跟踪变化Auditing changes】
触发器可以侦测数据库内的操作,从而不允许数据库中未经许可的指定更新和变化。

【级联运行 Cascaded operation】
触发器可以侦测数据库内的操作,并自动地级联影响整个数据库的各项内容。例如,某个表上的触发器中包含有对另外一个表的数据操作(如删除,更新,插入)而该操作又导致该表上触发器被触发。

【存储过程的调用 Stored procedure invocation】
为了响应数据库更新触,发器可以调用一个或多个存储过程,甚至可以通过外部过程的调用而在DBMS( 数据库管理系统)本身之外进行操作。
由此可见,触发器可以解决高级形式的业务规则或复杂行为限制以及实现定制记录等一些方面的问题。例如,触发器能够找出某一表在数据修改前后状态发生的差异,并根据这种差异执行一定的处理。此外一个表的同一类型(INSERT、 UPDATE、 DELETE)的多个触发器能够对同一种数据操作采取多种不同的处理。
总体而言,触发器性能通常比较低。当运行触发器时,系统处理的大部分时间花费在参照其它表的这一处理上,因为这些表既不在内存中也不在数据库设备上,而删除表和插入表总是位于内存中。可见触发器所参照的其它表的位置决定了操作要花费的时间长短。

fishermen已经说得差不多了,补充一点:触发器也好,存储过程也好,这些都是一堆SQL,只是将一些业务流程、控制流程或基于规则的数据和业务控制功能封装在数据库层