目录搜索
oracle知识ORACLE的数据类型Oracle技术网—DBMS_Job包的用法Oracle技术网—Oracle for NT系统实用工具介绍Oracle技术网—Oracle常见错误代码Oracle技术网—Oracle常用ScriptOracle技术网—Oracle常用数据字典Oracle技术网—ORACLE数据库简介Oracle技术网—Oracle特殊包Oracle技术网—Oracle相关站点Oracle技术网—哪些初始化参数最影响Oracle系统性能PL/SQLDBAOracle7 7.3.2.2Oracle技术网—listener.log的内容增长很快,是否可以删除重建Oracle技术网—ORACLE表空间恢复方案Oracle技术网—Oracle常用系统文件有哪些Oracle技术网—ORACLE回滚段管理(上)Oracle技术网—ORACLE回滚段管理(下)Oracle技术网—Oracle如何决定使用哪个回退段Oracle技术网—Oracle数据库的空间管理技巧Oracle技术网—Oracle数据库碎片整理Oracle技术网—Oracle数据库有哪几种关闭方式Oracle技术网—Oracle数据库有哪几种启动方式Oracle技术网—Oracle预定义角色有哪些Oracle技术网—ROLLBACK不能回滚的命令Oracle技术网—查看哪些session正在使用哪些回滚段Oracle技术网—存储参数(storage子句)含义及设置技巧Oracle技术网—和权限有关的表有哪些Oracle技术网—漫谈数据库的启动和关闭Oracle技术网—哪些初始化参数最影响Oracle系统性能Oracle技术网—如何备份控制文件Oracle技术网—如何查出前台正在发出的sql语句Oracle技术网—如何查看Oracle版本及安装了哪些选项Oracle技术网—如何查看Oracle数据表的建表语句Oracle技术网—如何查看SGA区剩余可用内存Oracle技术网—如何查看各个表空间占用磁盘情况Oracle技术网—如何查看后台进程Oracle技术网—如何查看什么时间有哪些数据库对象结构被修改过Oracle技术网—如何查看数据库的各种数据文件Oracle技术网—如何查看数据库的字符集Oracle技术网—如何查看数据文件是否自动扩展Oracle技术网—如何查看数据文件所在的路径Oracle技术网—如何查看用户表上的约束内容Oracle技术网—如何查看用户表所占空间的大小Oracle技术网—如何查询出primary key和forgen key的关系表Oracle技术网—如何改变当前联机日志文件的大小Oracle技术网—如何利用DBMS_SQL包和游标计算当前用户下所有表的行数Oracle技术网—如何启动ARCHIVELOG模式Oracle技术网—如何取出某一用户的密码,再原封不动的改回去Oracle技术网—如何设置BLOCK_SIZE大于2K,如:4K、16KOracle技术网—如何手工指定使用哪个回退段Oracle技术网—如何修改internal的口令Oracle技术网—如何移动控制文件到新的目录中Oracle技术网—如何移数据库文件Oracle技术网—如何增加表空间的大小Oracle技术网—怎样查看init.ora文件Oracle技术网—怎样查看SGA值Oracle技术网—怎样查看哪些用户拥有SYSDBA、SYSOPER权限?Oracle技术网—怎样快速查出Oracle 数据库中的锁等待Oracle技术网—怎样识别IO竞争和负载平衡Exp vs ImpOracle技术网—EXP、IMP 命令详解Oracle技术网—Exp/Imp大量数据Oracle技术网—Export/Import 使用技巧与常见错误Oracle技术网—Oracle数据库的备份与恢复Oracle技术网—如何把数据exp到Sql loader里Oracle技术网—如何单独备份一个或多个表Oracle技术网—如何单独备份一个或多个用户Oracle技术网—如何导入指定表Oracle技术网—如何建立一个与现存数据库相同,但不包含数据的空库Oracle技术网—如何在oracle7和oracle8之间exp/imp数据Oracle技术网—提高ORACLE数据库系统import性能Oracle技术网—为何我的导出文件只有500KOracle技术网—自动备份Oracle数据库Oracle技术网—作Export或Import时,如何记录LOG信息?SQL技巧Oracle技术网—LONG数据类型使用上的一些说明Oracle技术网—Oracle8 PL/SQL编程风格与系统性能的提高Oracle技术网—Oracle8中用户名、表名、列名、索引名...可以用中文命名吗Oracle技术网—Oracle中如何实现某一字段自动增加1Oracle技术网—SQL(Structured Query Language)语句分哪几类Oracle技术网—SQL*PLUS常用命令列表Oracle技术网—SQL*Plus系统环境变量有哪些?如何修改?Oracle技术网—SQL*Plus中缓冲区命令列表Oracle技术网—SQL*Plus中能运行哪几种命令Oracle技术网—SQLPlus中的复制和粘贴技巧Oracle技术网—查看本用户下的各种对象的SQL脚本Oracle技术网—查找a表中有,而在b表中没有的记录Oracle技术网—利用PL/SQL打印ASCII表Oracle技术网—如何查找、删除表中重复的记录Oracle技术网—如何对CLOB行字段执行全文检索Oracle技术网—如何对CLOB字段进行全文检索?Oracle技术网—如何改变表中列的名字Oracle技术网—如何改变一个字段初始定义的Check范围Oracle技术网—如何给表、列加注释Oracle技术网—如何将 primary key 建在其它的表空间上Oracle技术网—如何删除表中的列Oracle技术网—如何使‘CREATE TABLE AS SELECT’能支持ORDER BY ?Oracle技术网—如何通过 SQL*PLUS 将符号 & 、'号(单引号) 插入Oracle数据库的表中Oracle技术网—如何用SQL生成SQL批处理文件Oracle技术网—如何在PL_SQL中读写文件Oracle技术网—如何自动生成一个含有20000101至20500101共50年日期的表Oracle技术网—如何自动生成一个含有2000年01月至2050年01月共50年月份的表Oracle技术网—删除a表中和b表相同的数据Oracle技术网—在Oracle快速进行数据行存在性检查Oracle技术网—怎样查看表的结构Oracle技术网—怎样改变SQL*Plus启动时默认路径Oracle技术网—怎样计算表中的记录数Oracle技术网—怎样在SQL*Plus中使用 '&' 来实现自定义参数变量?Oracle技术网—怎样在查询记录时给记录加锁Oracle错误Oracle7 7.3.2.2Oracle技术网—Oracle 816中如何启动Enterprise ManagerOracle技术网—Oracle Enterprise Manager(OEM)工具中如何以SYSOPER、SYSDBA方式登录Oracle技术网—ORACLE数据库应用开发常见问题及排除Oracle技术网—监听器错误Oracle技术网—联机热备份失败后,如何打开数据库Oracle技术网—没有备份、只有归档日志,如何恢复数据文件Oracle技术网—某个数据文件损坏,如何打开数据库Oracle技术网—如何使用归档日志进行完全恢复Oracle技术网—如何正确建立TYPE、partition(分区)Oracle技术网—一个控制文件被损坏,如何启动Oracle技术网—在SQL*Plus中insert进的都是中文的,为什么一存入服务器后,再select出的就是???了Oracle技术网—重装Oracle服务器后,以前的数据可以恢复吗Oracle初学者入门Oracle技术网—Oracle 8.1.6 for Win2000 系统文件解释Oracle技术网—Oracle 基本知识Oracle技术网—Oracle8 数据类型Oracle技术网—what is sql?Oracle技术网—安装、配置后,SQL*Plus操作初步Oracle技术网—安装Oracle后,经常使用的修改表空间的SQL代码Oracle安装、删除Oracle技术网—Oradim工具的用法Oracle技术网—WINDOWS NT上,如何删除ORACLE SERVICEOracle技术网—如何连接两台Oracle服务器Oracle技术网—如何在Windows 2000下将Oracle完全卸载Oracle技术网—如何在WINDOWS NT上删除所有的Oracle安装?Oracle技术网—手工安装数据库时需要安装那些系统包Oracle技术网—手工创建数据库的全部脚本及说明Oracle安全性问题Oracle技术网—Linux ORACLE 8.1.5漏洞Oracle技术网—Oracle 8.1.6的oidldapd中的漏洞Oracle技术网—Oracle8的不安全因素及几点说明Oracle技术网—Oracle数据库的安全策略Oracle技术网—Oracle数据库密码文件的使用和维护Oracle技术网—提高Oracle数据库应用系统安全的举例与分析数据库安全性策略Oracle系统设置、优化、连接《Oracle8 优化技术》摘录 (第一章 安装)《Oracle8 优化技术》摘录 (第二章 内存/CPU)《Oracle8 优化技术》摘录 (第三章 输入/输出)Oracle技术网—ASP 中通过OLEDB访问 Oracle 的代码Oracle技术网—Delphi5 企业版使用BDE访问 Oracle方法Oracle技术网—oracle database access objectOracle技术网—Oracle基于Client/Server的性能调整Oracle技术网—PB7 连接 Oracle 的配置方法Oracle技术网—PB内置Oracle数据库接口的使用方法Oracle技术网—PHP+Oracle(OCI) 初步Oracle技术网—PHP4连接Oracle 8i的方法(转译)Oracle技术网—多个数据库时,如何设置默认数据库Oracle技术网—如何备份Oracle设置Oracle技术网—如何让你的SQL运行得更快Oracle技术网—如何修改 SQL*Plus 的启动参数Oracle技术网—如何在Windosws 2000中安装JSP并访问OracleOracle技术网—如何在Windosws 2000中安装perl并访问OracleOracle技术网—如何在Windosws 2000中安装PHP4并访问OracleOracle技术网—如何在Windosws NT中使用批处理命令自动启动或关闭Oracle ServicesOracle技术网—如何在客户端省略输入数据库串,而只输入用户名、密码即可Oracle技术网—使用Database Configuration Assistant安装第二个数据库Oracle技术网—修改Oracle7数据库maxdatafiles参数的方法索引、序列、快照、数据库链路、触发器Oracle技术网—触发器的几种应用Oracle技术网—建立触发器时最容易忽略的两个地方Oracle技术网—快照和触发子结合使用的例子Oracle技术网—能否通过视图更新表中的数据Oracle技术网—如何创建一个简单的JAVA存储过程?Oracle技术网—如何创建隐藏IP地址的最后一项的函数?Oracle技术网—如何加密Oracle中的存储过程Oracle技术网—为什么有时ORACLE数据库不用索引来查找数据Oracle技术网—我的数据库链路为什么不工作Oracle技术网—一个建立快照的简单例子Oracle技术网—怎样创建一个简单的自定义过程并引用Oracle技术网—怎样手工刷新快照oracle与其他数据库的比较MySQL 测试Oracle技术网—Oracle 和 mysql 的一些简单命令对比参照Oracle技术网—Oracle8i和Microsoft SQL Server7.0比较Oracle技术网—比较SQL Server与Oracle、DB2Oracle技术网—各种数据类型的比较Oracle技术网—戏说SQL—几种SQL 服务器的比较关键任务      在Internet上运作公司是一项艰苦的任务其它知识OEM常见问题及其解决办法Oracle 8 资料库函式库Oracle 资料库函式库Oracle技术网—Decode()函数使用技巧(NT+IIS+ASP+ORACLE)Oracle技术网—Dual伪列Oracle技术网—NULL 使用详解Oracle技术网—OLAP及其多维数据分析Oracle技术网—Oracle for NT系统实用工具介绍Oracle技术网—ORACLE 用户的规范化管理Oracle技术网—user、uid伪列Oracle技术网—大型数据库设计原则Oracle技术网—留言簿(带Oracle数据库分页的显示功能)Oracle技术网—漫谈oracle中的空值Oracle技术网—如何正确利用Rownum来限制查询所返回的行数Oracle技术网—什么是ROWID,为什么需要它Oracle技术网—数据库技术考试大纲(中级)Oracle技术网—数据库行业的现状和展望Oracle技术网—在客户端处理Oracle的数据行加锁问题如何对CLOB行字段执行全文检索Developer 2000Oracle技术网—Developer/2000中各键盘触发子所对应的“按键”Oracle技术网—FORM调用REPORT时,如何去掉report serverOracle技术网—FORM中,Exception(例外)都有哪些,如何书写Oracle技术网—FORM中,FORM中,如何引入图像Oracle技术网—FORM中,WINDOW标题的设置Oracle技术网—FORM中,常用快捷键有哪些Oracle技术网—FORM中,触发子exit_form的两种功能是什么Oracle技术网—FORM中,当光标走到块的最后一项时,如何让按“enter回车”键时,光标自动走到下一条记录的第一项?Oracle技术网—FORM中,当用鼠标点击标签画布的某一“标签页”时,如何判断点击的是哪一页Oracle技术网—FORM中,如何屏蔽默认的功能键Oracle技术网—FORM中,如何实现屏幕同步刷新?Oracle技术网—FORM中,如何使用警告Oracle技术网—FORM中,如何通过 ODBC 访问 Acress 数据?Oracle技术网—FORM中Oracle技术网—FORM中,设置应用特性(光标类型)Oracle技术网—FORM中,怎样创建动态下拉列表ListOracle技术网—FORM中如何存取声音Oracle技术网—FORM中如何存取图象?如何把图象从一个表中导到另一个表中?Oracle技术网—MIS中的图像应用技术Oracle技术网—MIS中的图像应用技术Oracle技术网—从FORM中调用REPORT时,如何使打印结果直接输出到打印机上Oracle技术网—如何从FORM中调用REPORT程序Oracle技术网—如何改变FORM(FMX模块)运行时的title?Oracle技术网—如何在FORM运行中,使定制菜单中的“窗口(W)”菜单项不显示Oracle技术网—如何在启动FORM程序时直接登录到Oracle数据库上?Oracle技术网—运行FORM时,如何使按钮变灰(即无效)Oracle技术网—运行FORM时,如何使窗口(runtime窗口、画布窗口)自动变成最大化、最小化?Oracle技术网—在Developer/2000中如何读写文本型操作系统文件Oracle技术网—在Oracle中实现报表的定长输出linux vs UnixHow To Install Oracle 8.0.5 onto RedHat Linux 6HOWTO: OAS for Linux on FreeBSDHOWTO: Oracle for Linux on FreeBSDOracle 7.3.4 Enterprise Edition for SCO UNIX 安装步骤Oracle技术网—Oracle .com 套件在TurboLinux上的安装Oracle技术网—ORACLE 7.3 Enterprise在SCO OPEN SERVER 5.02 及 5.04 的安装过程Oracle技术网—ORACLE 7.3.4.2 for SCO Unix 安装说明Oracle技术网—Oracle 8 for solaris 2.6 安装步骤Oracle技术网—Oracle 8(8.0.5)标准版安装指南Oracle技术网—Oracle 8i(8.1.5)企业版安装指南Oracle技术网—ORACLE FOR SUN SOLARIS 安装手册Oracle技术网—ORACLE FOR SUN SOLARIS 维护手册Oracle技术网—ORACLE V.7.3.4.3 FOR AIX 安装说明Oracle技术网—ORACLE8I FOR SUN SOLARIS2.7 安装说明Oracle技术网—RedHat 6.1 Step-by-step Install notes for Oracle 8iOracle技术网—RedHat Linux 6.0 上 Oracle 8(8.0.5)标准版 安装实例Oracle技术网—RedHat Linux 6.0 上 Oracle 8i R2 (8.1.6) 企业版安装实例Oracle技术网—如何集成Linux/Apache/PHP4/FastCGI/Oracle/MySQL环境Oracle技术网—如何在你的Linux机器上安装运行OracleOracle技术网—为Linux配备Oracle 8Oracle技术网—在RedHat 6.0上安装Oracle 8i(全攻略)
文字

    
Oracle8 PL/SQL编程风格与系统性能的提高
来源:http://www.info365.com.cn/
作者:杨延广 曹素丽

  摘 要:介绍了Oracle 8 PL/SQL程序设计中,提高系统性能的编程风格的几种方法,和存储过程及触发器的使用、错误处理等。
  关键词:Oracle;SQL;存储过程;触发器;错误处理
  中图分类号:TP311.11  文献标识码:B
文章编号:1001-9081(2000)02-0073-02

  Oracle是C/S(Client/Server)结构的大型数据库,主要语言是4GLSQL语言,具有功能强大而简单易学的优点。C/S结构的工作过程是:当客户端(C端)输入并发送一条SQL语句后,便通过网络送到服务器端(S端),在那里被分析执行然后再将结果通过网络返回到客户端,此时客户端可以再发下一条SQL语句。可见,客户端是一条语句一条语句的发送,服务器端是一条一条的分析执行,结果再一次次的返回。但是,这样单个的SQL语句引起了频繁的网络通信,大大降低了系统性能。PL/SQL是扩展SQL后的语言,PL/SQL块作为一个单位发送,使用了较少的网络通信,而且在运行中能根据条件,决定执行或重复执行什么语句,既保留了SQL的强大性,又弥补了不足。

1 提高程序的运行速度

1.1 使用存储过程
  存储过程是Oracle数据库的一种对象,是一种带名的PL/SQL过程程序块,它在创建后,被数据库服务器进行语法和句法分析,以编译了的形式存储在数据库中,可以被有权用户在任何需要的地方调用。当客户端应用程序调用时,只需发送一条调用命令,数据库服务器就会执行该过程。与一般的PL/SQL块主要的不同是:无需在网上传送大量的源程序代码,只传送一条调用命令,这就大大降低了网络通信的负担;而且只在刚创建时分析编译一次,每次调用直接执行编译了的代码,因此运行速度较快。
  在实际开发时,对于具有共同特性的功能模块最好使用存储过程,调用时通过使用不同的实际参数值来实现某一具体的处理。如果能充分利用存储过程来完成应用系统的操作与处理,则可大大提高系统的运行性能。
1.2 编写可重用共享池中已有语句的SQL语句
  共享内存缓冲区和后台进程合称为一个Oracle实例。当启动一个Oracle实例时,会有许多的Oracle后台进程被启动,每个进程都负责运行数据库的不同方面的处理,各进程通过共享内存彼此之间进行通信,该块内存就是系统全局区SGA。SGA被分隔为不同的区域,其中一个称作共享池(Shared Pool)的区域中包含了发送给数据库的SQL语句的正文和PL/SQL块,以及它们经过分析后的表示形式与执行方案,其中执行方案是数据库实际处理该语句的方法,例如,需要访问哪些表和索引、是否需要执行排序操作等等。
  因为要执行一条SQL 语句,数据库就必须确定其执行方案。当数据库从客户应用程序接收到一条SQL语句时,它首先检查是否该语句在共享池中。若在,那么不重新对其分析而是重复使用已经在共享池中的形式及执行方案;若不在,则对该语句进行分析,得到新的分析形式与执行方案并进行存储,覆盖共享池中以前的内容。
  由此可以看出,编写可重用共享池中语句的SQL语句就显得十分必要,因为避免不必要的重新分析,会很大程度上减小服务器所承担的工作量。要想重复使用共享池中的语句,就应该编写与其格式一致的语句,包括字母的大小写、标点符号、换行的位置等都要一致。下面推荐一种有效实用的方法。
1.2.1 SQL语句各部分的格式
  一条语句可以一行也可以分多行书写,但最好换行书写,每一子句一行,且每行的第一个关键字与第一行的关键字的尾部对齐,这样做以确保每次使用同一条语句时分行的位置一致,而不要让语句在第80列偶然溢出到下一行,例如下面的格式中字母T、M、E、D、P是对齐的,一子句占了一行:
  SELECT col1,col2
  FROM tablename1
  WHERE col1 > col2
  AND col2 > col3
  GROUP BY col1;
  当刚执行过上述语句后,若又接收到下面的语句:
  SELECT col1,col2
  FROM tablename2
  WHERE col1 > col2
  AND col2 > col3
  GROUP BY col2;
  则通过检查认为与共享池中的语句一致,可重复使用共享池中的执行方案,不必重新分析。
  而下面的的语句被认为是不同的,因为分行的位置不同,需要重新进行分析。
  SELECT col1,col2 FROM tablename2
  WHERE col1 > col2
  AND col2 > col3
  GROUP BY col1 ;
1.2.2 字母大小写采用一致约定
  关键字、保留字大写,用户声明的标识符小写。请看下面的两条语句:
  SELECT xm
  FROM student;
  与
  select xm
  FROM student;
  比较的结果是这两句不匹配或者说不等价,因为第一句中的SELECT是大写的,而第二句的是小写的。
1.2.3 其它,如运算符两侧各留一个空格等
  总之,设计自己的编写约定并遵守这些约定,使要处理的语句与共享池中的相一致,有助于运行性能的提高。

2 提高可维护性

2.1 编写触发器
  对表中数据进行修改、删除或插入是非常常见的操作。当表被修改时,应该自动给其他需要执行操作的程序发信号。触发器可以完成这一功能。在Oracle8中,触发器是一段程序,但是这段程序是当发生INSERT、UPDATE或DELETE操作时被自动执行的,与过程的调用(是通过调用语句调用执行)不同,因此当某事件的发生引起连环更新或其他的相应操作时,通过自动执行触发器代码实现而不用人工干预,大大减轻了维护工作,同时也很好的保证了数据的一致性。
  触发器的优点是自动激发,不管什么引起数据修改(来自程序的或是来自用户的),它们都工作,所以常常用于不同数据表中的相关数据的串接修改。采用这种方法实现数据表间接的数据关联可由数据库集中维护控制,规则变化时只需修改相应的触发器即可,这样系统易于维护,提高了工作效率。
2.2 使用%TYPE、%ROWTYPE方式声明变量
  程序设计中常常要通过变量来实现程序间的数据传递,即将表中数据赋值给变量,或是把变量值插入到表中。而要完成这些操作的前提就是,表中数据与变量类型要一致。然而在实际中,表中数据或类型、或宽度有时要变化,一旦变化,就必须去修改程序中的变量声明部分,否则程序将不能正常运行。为了减少这部分程序的修改,编程时使用%TYPE、%ROWTYPE方式声明变量,使变量声明的类型与表中的保持同步,随表的变化而变化,这样的程序在一定程度上具有更强的通用性。

3 提高程序自检能力

  一个好的应用系统不仅要有好的用户界面、齐全的功能处理模块,而且要有很强的错误处理能力。因此要求编程人员要预测可能的各种情况(声明异常情态并引发),并尽可能从错误中恢复过来(编写相应异常情态处理器代码),这就是Oracle8中的异常部分的程序设计内容。然而这部分的设计绝非易事。在异常部分的最后设置OTHERS异常情态处理器是个很好的编程习惯,因为它为运行时刻捕捉到的其它错误指明了处理去向,从而保证了程序的正常运行。格式如下:
  BEGIN
  …
  EXCEPTION
   WHEN excepname1 THEN
   …
   WHEN excepname2 THEN
   …
   WHEN OTHERS THEN
   …
  END;
  但是对程序中出现的错误要做到正确的处理(即正确选择异常处理器并执行它),还必须弄清楚异常情态的传播问题。
  异常情态的传播指的是当在程序块的声明、执行、异常部分分别出现异常情态时,或在本块中没有相应的异常处理器时会将这个异常情态传播到哪里,会去激发那个块中的处理器。传播规则是这样的:
  当一个异常情态是在块的执行部分引发的(最常见的),PL/SQL使用下面的规则确定激活哪个异常处理器。(1)若当前块对该异常情态设置了处理器,则执行它并成功完成该块的执行,然后控制转给包含块。(2)若当前块没有该处理器,则通过在包含块中引发它来传播异常情态。然后对包含块执行步骤1。另外,无论是在声明部分引发了一个异常情态,还是在异常处理部分引发,则该异常情态将立即传播给包含块。在包含块引用上述规则进行异常情态的处理,即使在当前块设置了OTHERS处理器也不会被执行。

4 易于阅读

  .对于子程序、触发器、包等带名的程序块,使用结束标识。例如:
  CREATE OR REPLACE PROCEDURE addstud IS
  …
  BEGIN
  …
  END addstud;   
  .采用统一的标识符命名规则。对于诸如变量名、子程序名、触发器名等数据库对象命名时,应尽量能表示其功能用途或含义。
  .对于过程性语句与程序块采用缩进书写风格,会使得程序结构清晰、层次分明、易阅读。
  .采用统一的字母大小写。尽管PL/SQL程序中不区分大小写,但是采用统一的字母大小写(如前文叙述的大小写约定)将在很大程度上提高程序的可阅读性。
  .加注释。
  .一条语句分多行书写,不让其自动分行。
  这方面的内容大家都已很熟悉,不再详述了。
  总之,良好的程序设计风格,可以在多个方面提高系统的性能,提高开发效率,很值得我们在工作中给以重视。

作者简介:杨延广 (1965-),男,讲师,主要研究方向:计算机应用;
     曹素丽 女,工程师,主要研究方向:计算机应用。

作者单位:杨延广(石家庄邮政高等专科学校 河北.石家庄050011)
     曹素丽(石家庄邮政高等专科学校 河北.石家庄050011)

上一篇:下一篇: