数据库中存储过程、函数、触发器的区别
存储过程、函数、触发器的区别
比较项目 |
存储过程 |
函数 |
是否有返回值 |
可以有,也可以没有 |
必须有且只有一个 |
是否可以单独执行 |
可以 |
必须通过execute执行 |
SQL语句(DML或SELECT)可否调用 |
不可以 |
可以,且可以位于FROM关键字的后面(由于可以返回表对象) |
参数类型 |
可以使用IN、OUT、IN OUT三种模式的参数 |
只有IN,Oracle可以使用IN、OUT、IN OUT三种参数 |
返回值类型 |
可以通过OUT、IN OUT参数返回零个或多个参数值 |
单一值或一个表对象 |
1)一般来说,存储过程实现的功能要复杂一点,而函数实现的功能针对性比较强。
2)存储过程一般是作为一个独立的部分来执行(参照下面“存储过程-调用方法”),而函数可以作为查询语句的一个部分来调用(用在select后面,或者from后面)。由于函数可以返回一个表对象,因此它可以在查询语句中位于FROM关键字的后面。
存储过程(Stored Procedure )是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中。存储过程经过语法检查和编译的SQL语句,所以执行速度比普通的SQL语句的执行速度快。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
1. 存储过程只在创建时进行编译,以后执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2. 当对数据库进行复杂操作时(如对多个表进行Update、Insert、Query、Delete时),可将此复杂操作用存储过程封装起来。
3. 可以在过程中调用另一个存储过程。可以在存储过程中调用函数。这可以简化一系列复杂语句。
4. 安全性高,可设定只有某用户才具有对指定存储过程的使用权。
5. 参数有三种(IN、OUT、IN OUT),可返回多个参数值。
6. 在ORACLE 中,若干个有联系的过程可以组合在一起构成程序包。
7. 存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。
1. 不可移植性,每种数据库的内部编程语法都不太相同,当需要兼容多种数据库时,最好不要用存储过程。
2. 业务逻辑多处存在,采用存储过程后也就意味着你的系统有一些业务逻辑不是在应用程序里处理,这种架构会增加一些系统维护和调试成本。
createprocedure <过程名>(<参数列表,无参时忽略>)
as|is
变量声明、初始化
begin
业务处理、逻辑代码
exception
异常捕获、容错处理
end <过程名>;
参数:<参数名> in|out|in out <参数类型,无长度说明> ,如:v_name varchar2
in:入参
out:出参
in out:出入参
注:as|is表示as或is
调用语法
调用语法:
1)exec <过程名>;
2)execute <过程名>;
3)对于Oracle数据库,可在PL/SQL语句块中直接调用。(Oracle)
数据库中的函数包括内置函数和自定义函数,内置函数是诸如SUM(),COUNT(),AVG()等数据库内置的函数。一般我们编写的函数都属于自定义函数。
1. 函数只有一种参数(IN),只有一条RETURN语句,只能返回单一的值。
2. 可在SQL语句(DML或SELECT)中调用函数。由于函数可以返回一个表对象,因此它可以在查询语句中位于FROM关键字的后面。
create function <函数名>(<参数列表,无参时忽略>)
return <返回值类型,无长度说明>
as|is
变量声明、初始化
begin
业务处理、逻辑代码
return <返回的值>;
exception
异常捕获、容错处理
end <函数名>;
参数:in入参
注:只有入参的类型。
调用语法
1)在SQL语句(DML或SELECT)中调用函数
2)对于Oracle数据库,可在PL/SQL语句块中直接调用。(Oracle)
触发器
触发器是特殊的存储过程,存储过程需要程序调用,而触发器会自动执行;