Oracle中存储过程和函数的区别

Oracle中存储过程和函数的区别,第1张

定义:

存储过程(Stored Procedure )是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程

带有参数)来执行它。

存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。

存储过程是由流控制和SQL 语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,应用程序使用时只要调用即可。

在ORACLE 中,若干个有联系的过程可以组合在一起构成程序包。

优 点:

1 存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。

2当对数据库进行复杂 *** 作时(如对多个表进行Update、Insert、Query、Delete时),可将此复杂 *** 作用存储过程封装起来与数据库提供的事务处理结合一起使用。

3存储过程可以重复使用,可减少数据库开发人员的工作量。

4安全性高,可设定只有某用户才具有对指定存储过程的使用权。

存储过程与函数的对比

存储过程的优缺点

优点:减少网络交互的成本。

缺点:

a、不可移植性,每种数据库的内部编程语法都不太相同,当你的系统需要兼容多种数据库时,最好不要用存储过程。

b、学习成本高,DBA一般都擅长写存储过程,但并不是每个程序员都能写好存储过程,除非你的团队有较多的开发人员熟悉写存储过程,否则后期系统维护会产生问题。

c、业务逻辑多处存在,采用存储过程后也就意味着你的系统有一些业务逻辑不是在应用程序里处理,这种架构会增加一些系统维护和调试成本。

d、存储过程和常用应用程序语言不一样,它支持的函数及语法有可能不能满足需求,有些逻辑就只能通过应用程序处理。

e、如果存储过程中有复杂运算的话,会增加一些数据库服务端的处理成本,对于集中式数据库可能会导致系统可扩展性问题。

f、为了提高性能,数据库会把存储过程代码编译成中间运行代码(类似于java的class文件),所以更像静态语言。当存储过程引用的对像(表、视图等等)结构改变后,

存储过程需要重新编译才能生效,在247高并发应用场景,一般都是在线变更结构的,所以在变更的瞬间要同时编译存储过程,这可能会导致数据库瞬间压力上升引起故障(Oracle数据库就存在这样的问题)。

游标有显示游标和隐式游标之分,显示游标需要自己去定义,declare cursor(这个自己看书去吧),这样使用游标一条条地取值使用。而隐式游标针对所有的select语句都是的。

函数和存储过程几乎没有区别,只是前者有返回值,后者没有,如果后者定义了出参,那就和函数的功能是一样的了。

函数有返回值,而过程没有,

简单点就是

function test_f (parameter in varchar2) return varchar2;

procdrue test_p (parameter in varchar2);

declare

result varchar2;

begin

result := test_f; --函数有返回值 必须用变量去装载

test_p; --过程没有可直接调用

end;

1:函数:可以直接调用的已解析的程序块,可以在sql中直接使用

2:存储过程:可以直接调用的已解析的程序,不能直接在SQL中使用

3:视图:把特定数据封装到一起的集合

4:DBlink:跨数据库的直接访问方式之一,只需在表名后@dblin名就可以直接查询表

过程:函数和存储过程的统称。

函数:有且仅有一个返回值,可以用于SQL语句中。 如:x := get_X(),select get_X() from dual,返回值为函数调用的结果。

存储过程:无返回值。要返回结果,必须声明为out参数。

如:sp_x(x,y,z),x和y为in类型参数,z为out/in out类型参数。

在oracle中,封装工具还有自定义类型、包等。包可以封装过程和函数,包头类似JAVA中的接口,包体类似JAVA中实现接口的类。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/12155269.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存