Oracle是C/S(Client/Server)结构的大型数据库主要语言是GLSQL语言具有功能强大而简单易学的优点C/S结构的工作过程是当客户端(C端)输入并发送一条SQL语句后便通过网络送到服务器端(S端)在那里被分析执行然后再将结果通过网络返回到客户端此时客户端可以再发下一条SQL语句可见客户端是一条语句一条语句的发送服务器端是一条一条的分析执行结果再一次次的返回但是这样单个的SQL语句引起了频繁的网络通信大大降低了系统性能PL/SQL是扩展SQL后的语言PL/SQL块作为一个单位发送使用了较少的网络通信而且在运行中能根据条件决定执行或重复执行什么语句既保留了SQL的强大性又弥补了不足
提高程序的运行速度
使用存储过程
存储过程是Oracle数据库的一种对象是一种带名的PL/SQL过程程序块它在创建后被数据库服务器进行语法和句法分析以编译了的形式存储在数据库中可以被有权用户在任何需要的地方调用当客户端应用程序调用时只需发送一条调用命令数据库服务器就会执行该过程与一般的PL/SQL块主要的不同是无需在网上传送大量的源程序代码只传送一条调用命令这就大大降低了网络通信的负担而且只在刚创建时分析编译一次每次调用直接执行编译了的代码因此运行速度较快
在实际开发时对于具有共同特性的功能模块最好使用存储过程调用时通过使用不同的实际参数值来实现某一具体的处理如果能充分利用存储过程来完成应用系统的操作与处理则可大大提高系统的运行性能
编写可重用共享池中已有语句的SQL语句
共享内存缓沖区和后台进程合称为一个Oracle实例当启动一个Oracle实例时会有许多的Oracle后台进程被启动每个进程都负责运行数据库的不同方面的处理各进程通过共享内存彼此之间进行通信该块内存就是系统全局区SGASGA被分隔为不同的区域其中一个称作共享池(Shared Pool)的区域中包含了发送给数据库的SQL语句的正文和PL/SQL块以及它们经过分析后的表示形式与执行方案其中执行方案是数据库实际处理该语句的方法例如需要访问哪些表和索引是否需要执行排序操作等等
因为要执行一条SQL 语句数据库就必须确定其执行方案当数据库从客户应用程序接收到一条SQL语句时它首先检查是否该语句在共享池中若在那么不重新对其分析而是重复使用已经在共享池中的形式及执行方案若不在则对该语句进行分析得到新的分析形式与执行方案并进行存储覆盖共享池中以前的内容
由此可以看出编写可重用共享池中语句的SQL语句就显得十分必要因为避免不必要的重新分析会很大程度上减小服务器所承担的工作量要想重复使用共享池中的语句就应该编写与其格式一致的语句包括字母的大小写标点符号换行的位置等都要一致下面推荐一种有效实用的方法
SQL语句各部分的格式
一条语句可以一行也可以分多行书写但最好换行书写每一子句一行且每行的第一个关键字与第一行的关键字的尾部对齐这样做以确保每次使用同一条语句时分行的位置一致而不要让语句在第列偶然溢出到下一行例如下面的格式中字母TMEDP是对齐的一子句占了一行
SELECT colcol
FROM table—name
WHERE col > col
AND col > col
GROUP BY col;
当刚执行过上述语句后若又接收到下面的语句
SELECT colcol
FROM table—name
WHERE col > col
AND col > col
GROUP BY col;
则通过检查认为与共享池中的语句一致可重复使用共享池中的执行方案不必重新分析
而下面的的语句被认为是不同的因为分行的位置不同需要重新进行分析
SELECT colcol FROM table—name
WHERE col > col
AND col > col
GROUP BY col ;
字母大小写采用一致约定
关键字保留字大写用户声明的标识符小写请看下面的两条语句
SELECT xm
FROM student
与
select xm
FROM student
比较的结果是这两句不匹配或者说不等价因为第一句中的SELECT是大写的而第二句的是小写的
其它如运算符两侧各留一个空格等
总之设计自己的编写约定并遵守这些约定使要处理的语句与共享池中的相一致有助于运行性能的提高
提高可维护性
编写触发器
对表中数据进行修改删除或插入是非常常见的操作当表被修改时应该自动给其他需要执行操作的程序发信号触发器可以完成这一功能在Oracle中触发器是一段程序但是这段程序是当发生INSERTUPDATE或DELETE操作时被自动执行的与过程的调用(是通过调用语句调用执行)不同因此当某事件的发生引起连环更新或其他的相应操作时通过自动执行触发器代码实现而不用人工干预大大减轻了维护工作同时也很好的保证了数据的一致性
触发器的优点是自动激发不管什么引起数据修改(来自程序的或是来自用户的)它们都工作所以常常用于不同数据表中的相关数据的串接修改采用这种方法实现数据表间接的数据关联可由数据库集中维护控制规则变化时只需修改相应的触发器即可这样系统易于维护提高了工作效率
使用%TYPE%ROWTYPE方式声明变量
程序设计中常常要通过变量来实现程序间的数据传递即将表中数据赋值给变量或是把变量值插入到表中而要完成这些操作的前提就是表中数据与变量类型要一致然而在实际中表中数据或类型或宽度有时要变化一旦变化就必须去修改程序中的变量声明部分否则程序将不能正常运行为了减少这部分程序的修改编程时使用%TYPE%ROWTYPE方式声明变量使变量声明的类型与表中的保持同步随表的变化而变化这样的程序在一定程度上具有更强的通用性
提高程序自检能力
一个好的应用系统不仅要有好的用户界面齐全的功能处理模块而且要有很强的错误处理能力因此要求编程人员要预测可能的各种情况(声明异常情态并引发)并尽可能从错误中恢复过来(编写相应异常情态处理器代码)这就是Oracle中的异常部分的程序设计内容然而这部分的设计绝非易事在异常部分的最后设置OTHERS异常情态处理器是个很好的编程习惯因为它为运行时刻捕捉到的其它错误指明了处理去向从而保证了程序的正常运行格式如下
BEGIN
…
EXCEPTION
WHEN excep—name THEN
…
WHEN excep—name THEN
…
WHEN OTHERS THEN
…
END;
但是对程序中出现的错误要做到正确的处理(即正确选择异常处理器并执行它)还必须弄清楚异常情态的传播问题
异常情态的传播指的是当在程序块的声明执行异常部分分别出现异常情态时或在本块中没有相应的异常处理器时会将这个异常情态传播到哪里会去激发那个块中的处理器传播规则是这样的
当一个异常情态是在块的执行部分引发的(最常见的)PL/SQL使用下面的规则确定激活哪个异常处理器()若当前块对该异常情态设置了处理器则执行它并成功完成该块的执行然后控制转给包含块()若当前块没有该处理器则通过在包含块中引发它来传播异常情态然后对包含块执行步骤另外无论是在声明部分引发了一个异常情态还是在异常处理部分引发则该异常情态将立即传播给包含块在包含块引用上述规则进行异常情态的处理即使在当前块设置了OTHERS处理器也不会被执行
易于阅读
对于子程序触发器包等带名的程序块使用结束标识例如
CREATE OR REPLACE PROCEDURE addstud IS
…
BEGIN
…
END addstud;/* 此处的过程名add是可选的写上较好与块开始的CREATE相对应 */
采用统一的标识符命名规则对于诸如变量名子程序名触发器名等数据库对象命名时应尽量能表示其功能用途或含义
对于过程性语句与程序块采用缩进书写风格会使得程序结构清晰层次分明易阅读
采用统一的字母大小写尽管PL/SQL程序中不区分大小写但是采用统一的字母大小写(如前文叙述的大小写约定)将在很大程度上提高程序的可阅读性
加注释
一条语句分多行书写不让其自动分行
这方面的内容大家都已很熟悉不再详述了
总之良好的程序设计风格可以在多个方面提高系统的性能提高开发效率很值得我们在工作中给以重视