您当前的位置:首页 > 互联网教程

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

发布时间:2025-05-17 12:20:12    发布人:远客网络

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

二、请问下mysql和oracle的区别

价格是两个数据库之间最显着的差异。Oracle有一个名为Oracle Express Edition的东西,这个版本完全免费。不幸的是,该版本对这些功能有太多限制。如果你继续购买全功能标准版或企业版,它将花费你数万美元。另一方面,MySQL是一个开源数据库,完全免费。最着名的Facebook社交网站运行在MySQL上。

虽然MySQL使用三个参数来验证用户,即用户名,密码和位置,但Oracle使用了许多安全功能,如用户名,密码,配置文件,本地身份验证,外部身份验证,高级安全增强功能等。

虽然某些模式对象名称在Oracle和MySQL中都不区分大小写,例如列,存储过程,索引等,但在某些情况下,两个数据库之间的区分大小写不同;Oracle对所有对象名称都不区分大小写,但是,与Oracle不同,某些MySQL对象名称(如数据库和表)区分大小写(取决于底层操作系统)。

两个数据库中支持的字符类型存在一些差异。MySQL为字符类型提供CHAR和VARCHAR,最大长度允许为65,535字节(CHAR最多可以为255字节,VARCHAR为65.535字节)。另一方面,Oracle支持四种字符类型,即CHAR,NCHAR,VARCHAR2和NVARCHAR2;所有四种字符类型都需要至少1个字节长;CHAR和NCHAR最大可以是2000个字节,NVARCHAR2和VARCHAR2的最大限制是4000个字节。可能会在最新版本中进行扩展。

三、oracle数据库和mysql数据库的区别

1、并发性是oltp数据库最重要的特性,但并发涉及到资源的获取、共享与锁定。

2、mysql以表级锁为主,对资源锁定的粒度很大,如果一个session对一个表加锁时间过长,会让其他session无法更新此表中的数据。

3、虽然InnoDB引擎的表可以用行级锁,但这个行级锁的机制依赖于表的索引,如果表没有索引,或者sql语句没有使用索引,那么仍然使用表级锁。

4、oracle使用行级锁,对资源锁定的粒度要小很多,只是锁定sql需要的资源,并且加锁是在数据库中的数据行上,不依赖与索引。所以oracle对并发性的支持要好很多。

5、oracle支持serializable的隔离级别,可以实现最高级别的读一致性。每个session提交后其他session才能看到提交的更改。oracle通过在undo表空间中构造多版本数据块来实现读一致性,

6、每个session查询时,如果对应的数据块发生变化,oracle会在undo表空间中为这个session构造它查询时的旧的数据块。

7、mysql没有类似oracle的构造多版本数据块的机制,只支持read commited的隔离级别。一个session读取数据时,其他session不能更改数据,但可以在表最后插入数据。

8、session更新数据时,要加上排它锁,其他session无法访问数据。

9、mysql在innodb存储引擎的行级锁的情况下才支持事务。

10、保证提交的数据均可恢复,因为oracle把提交的sql操作线写入了在线联机日志文件中,保持到了磁盘上,

11、如果出现数据库或主机异常重启,重启后oracle可以考联机在线日志恢复客户提交的数据。

12、默认提交sql语句,但如果更新过程中出现db或主机重启的问题,也许会丢失数据。

13、oracle默认不自动提交,需要用户手动提交。

14、oracle逻辑备份时不锁定数据,且备份的数据是一致的。

15、mysql逻辑备份时要锁定数据,才能保证备份的数据是一致的,影响业务正常的dml使用。

16、oracle有成熟的热备工具rman,热备时,不影响用户使用数据库。即使备份的数据库不一致,也可以在恢复时通过归档日志和联机重做日志进行一致的回复。

17、myisam的引擎,用mysql自带的mysqlhostcopy热备时,需要给表加读锁,影响dml操作。

18、innodb的引擎,它会备份innodb的表和索引,但是不会备份.frm文件。用ibbackup备份时,会有一个日志文件记录备份期间的数据变化,因此可以不用锁表,不影响其他用户使用数据库。但此工具是收费的。

19、innobackup是结合ibbackup使用的一个脚本,他会协助对.frm文件的备份。

20、mysql对sql语句有很多非常实用而方便的扩展,比如limit功能,insert可以一次插入多行数据,select某些管理数据可以不加from。

21、oracle在这方面感觉更加稳重传统一些。

22、oracle:既有推或拉式的传统数据复制,也有dataguard的双机或多机容灾机制,主库出现问题是,可以自动切换备库到主库,但配置管理较复杂。

23、mysql:复制服务器配置简单,但主库出问题时,丛库有可能丢失一定的数据。且需要手工切换丛库到主库。

24、oracle有各种成熟的性能诊断调优工具,能实现很多自动分析、诊断功能。比如awr、addm、sqltrace、tkproof等

25、mysql的诊断调优方法较少,主要有慢查询日志。

26、mysql的用户与主机有关,感觉没有什么意义,另外更容易被仿冒主机及ip有可乘之机。

27、oracle的权限与安全概念比较传统,中规中矩。

28、oracle的分区表和分区索引功能很成熟,可以提高用户访问db的体验。

29、oracle有多种成熟的命令行、图形界面、web管理工具,还有很多第三方的管理工具,管理极其方便高效。

30、mysql管理工具较少,在linux下的管理工具的安装有时要安装额外的包(phpmyadmin, etc),有一定复杂性。