国家发展改革委网上办公系统二期项目数据库设计规范.doc_第1页
国家发展改革委网上办公系统二期项目数据库设计规范.doc_第2页
国家发展改革委网上办公系统二期项目数据库设计规范.doc_第3页
国家发展改革委网上办公系统二期项目数据库设计规范.doc_第4页
国家发展改革委网上办公系统二期项目数据库设计规范.doc_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

附件二国家发展改革委网上办公系统二期项目数据库设计规范编制单位:北京xxxx信息产业股份有限公司编 制 人:编制日期:二一一年四月国家发展改革委网上办公系统二期项目-数据库设计规范目 录第1章前言11.1 目的11.2 内容11.3 适用范围11.4 总体原则1第2章数据库的设计方法及流程32.1 设计方法32.2 设计流程42.2.1 需求分析阶段42.2.2 概念结构设计阶段52.2.3 逻辑设计阶段52.2.4 物理设计阶段52.2.5 数据库实施阶段62.2.6 数据库运行维护阶段62.2.7 建模工具6第3章数据库设计规范73.1 数据库规范化的五个要求73.1.1 要求一:表中应该避免可为空的列73.1.2 要求二:表不应该有重复的值或者列73.1.3 要求三:表中记录应该有一个唯一的标识符83.1.4 要求四:数据库对象要有统一的前缀名83.1.5 要求五:尽量只存储单一实体类型的数据93.2 对象命名规范93.2.1 规则93.2.2 表命名规范103.2.3 字段命名规范103.2.4 索引命名规范113.2.5 分区命名规范123.2.6 视图/物化视图命名规范123.2.7 触发器/函数/存储过程命名规范123.3 数据库编程规范133.3.1 书写规范133.3.2 注释规范153.3.3 语法规范193.3.4 sql性能规范213.3.4.1 批量操作,避免频繁使用commit213.3.4.2 避免动态sql,要使用绑定变量方式213.3.4.3 避免不必要的排序233.3.4.4 用where子句替换having子句233.3.4.5 用“=”替代“”233.3.4.6 删除表中所有记录时用truncate替代delete233.3.4.7 用union-all 代替union243.3.4.8 用(not) exists替代(not) in。243.3.4.9 使用decode函数来减少处理时间。243.3.4.10 使用表的别名(alias)。253.3.4.11 尽量减少对表的查询次数。253.3.4.12 用表连接替换exists。263.3.4.13 避免使用distinct,可以用exists替换distinct。263.3.4.14 避免使用耗费资源的操作273.3.4.15 避免对索引列使用数据库函数、计算表达式等等273.3.4.16 在查询条件中,避免不必要的类型转换。273.3.4.17 尽量避免字段与“null”比较283.3.4.18 在索引列上使用(!=)和 like 将不会使用索引。283.3.4.19 用case语句合并多重扫描283.3.5 job使用规范293.4 索引使用规范293.4.1 创建索引原则293.4.2 索引使用建议303.4.2.1 避免对条件字段进行操作303.4.2.2 避免隐式转换303.4.2.3 尽量避免 “”303.4.2.4 避免where子句中的is null和is not null313.4.2.5 数据分布不均匀列的索引使用313.4.2.6 需要时利用hint强制指定索引313.4.2.7 屏蔽无用索引323.4.2.8 like子句尽量前端匹配323.4.2.9 使用基于函数的索引323.4.2.10 使用分区索引333.4.2.11 使用位图索引333.4.2.12 使用复合索引333.4.2.13 少数情况下用全表扫描替代索引扫描343.4.3 总结343.5 分区表使用规范353.6 物理设计规范353.6.1 环境配置353.6.2 数据库配置353.6.2.1 数据库名与全局名353.6.2.2 数据库sid363.6.2.3 数据库连接类型363.6.2.4 sga配置363.6.2.5 pga配置363.6.2.6 数据库字符集363.6.3 其他参数配置363.6.3.1 db_files363.6.3.2 db_block_size363.6.3.3 sga_target373.6.4 控制文件373.6.4.1 冗余373.6.4.2 参数配置373.6.5 日志文件373.6.5.1 日志文件大小373.6.5.2 日志文件组数量373.6.5.3 日志成员数量373.6.6 表空间及数据文件设计原则383.6.6.1 永久表空间383.6.6.2 undo表空间383.6.6.3 临时表空间383.6.6.4 系统表空间38第4章数据库安全规范394.1 用户密码规范394.2 用户权限规范434.2.1 不同应用分配不同帐号434.2.2 删除或锁定无关帐号434.2.3 限制sysdba远程登录434.2.4 限制业务用户权限434.2.5 对用户的属性进行控制,434.2.6 启用数据字典保护434.3 数据库监听规范434.3.1 需要时为监听设置密码434.3.2 需要时设置信任ip集44第5章数据库评审455.1 评审范围455.2 评审标准45 iv 第1章 前言1.1 目的为规范国家发展改革委网上办公系统二期项目(以下简称“发改委二期项目)的数据库设计,特制定数据库设计规范。通过该规范,我们希望达到以下目标:1. 制定数据库设计规范,作为发改委二期项目范围内统一的数据库设计、规划、开发以及维护人员的技术参考资料。2. 更好的完成发改委二期项目的数据库设计与开发,以及后期的数据库维护。3. 从数据库的设计原则、设计文档几方面明确数据库设计的规范思想及命名规则、代码书写规则。4. 根据对一般业务系统的分析,将数据库和程序系统统一进行整体描述,展示数据库的表之间以及与程序模块间的关系。5. 规定除数据库设计所遵循的范式外的一些适用原则,在遵循数据库设计范式的基础上,合理地划分表,添加状态和控制字段等,并明确数据库设计中的注释规范。1.2 内容本规范主要根据发改委二期项目数据库性能特点,描述数据库环境配置、数据库物理设计、数据库逻辑设计、视图、存储过程、应用程序设计等方面的设计规范。1.3 适用范围适用于国家发展改革委网上办公系统二期项目数据库建设。1.4 总体原则本规范采用以下的原则:1. 所有名称都采用英文,且准确无误。2. 每个表必须有主键,一般的主键都是自动编号的。 3. 主键与对应的外键名字要一致。 4. 字段命名为表名+字段名,如article_id,采用小写加下划线完成。 5. 表与表之间的关联默认采用id实现。 6. 日期采用datetime。布尔值采用bit类型,数据是true和false 7. 一般情况,不使用数据库提供的表与表之间的关系与约束 ,而应使用程序来判别关系。如删除一行会同时牵涉到两个表,就按照顺序使用代码来完成。 8. 文本字段默认设置varchar(50),默认情况大文本采用varchar(max),因为varchar是可变长度的,不会浪费。 9. 表与表的关联是发生在一对多或多对多的情况下,一对一就用一个表。 10. 数据源控件(编程需要访问的)尽量不放在模板中,访问麻烦; 11. 所有的sql语句字段都要写全,不使用星号来代替; 12. 1.缩写的原则:1.通用的缩写,例如pwd,就一定要缩写 ;2.太长了,如unity currency,就缩写,其他的情况不允许缩写。3缩写一定要在注释部分将全称写出来第2章 数据库的设计方法及流程2.1 设计方法数据库设计方法目前可分为四类:直观设计法、规范设计法、计算机辅助设计法和自动化设计法。其中,新奥尔良法是目前公认的比较完整和权威的一种规范设计法。新奥尔良法将数据库设计分成需求分析(分析用户需求)、概念设计(信息分析和定义)、逻辑设计(设计实现)和物理设计(物理数据库设计)。目前,常用的规范设计方法大多起源于新奥尔良法,并在设计的每一阶段采用一些辅助方法来具体实现。以下是两种常用的规范设计方法:一、 基于e-r模型的数据库设计方法。该方法是由p.p.s.chen于1976年提出的数据库设计方法,其基本思想是在需求分析的基础上,用e-r(实体联系)图构造一个反映现实世界实体之间联系的企业模式,然后再将此企业模式转换成基于某一特定的dbms的概念模式。二、 基于3nf的数据库设计方法。该方法是由satre提出的结构化设计方法,其基本思想是在需求分析的基础上,确定数据库模式中的全部属性和属性间的依赖关系,将它们组织在一个单一的关系模式中,然后再分析模式中不符合3nf的约束条件,将其进行投影分解,规范成若干个3nf关系模式的集合。 其具体设计步骤分为五个阶段: a) 设计企业模式,利用规范化得到的3nf关系模式画出企业模式; b) 设计数据库的概念模式,把企业模式转换成dbms所能接受的概念模式,并根据概念模式导出各个应用的外模式; c) 设计数据库的物理模式(存储模式); d) 对物理模式进行评价; e) 实现数据库。2.2 设计流程以规范性设计为例,把数据库设计流程分为以下几个阶段:a. 需求分析阶段:综合各个用户的应用需求(现实世界的需求)。b. 概念设计阶段:形成独立于机器和各dbms产品的概念模式(信息世界模型),用e-r图来描述。c. 逻辑设计阶段:将e-r图转换成具体的数据库产品支持的数据模型,如关系模型,形成数据库逻辑模式。然后根据用户处理的要求,安全性的考虑,在基本表的基础上再建立必要的视图(view)形成数据的外模式。d. 物理设计阶段:根据dbms特点和处理的需要,进行物理存储安排,设计索引,形成数据库内模式。e. 数据库实施阶段f. 数据库运行与维护阶段2.2.1 需求分析阶段需求收集和分析,得到数据字典描述的数据需求和数据流图描述的处理需求。需求分析的重点:调查、收集与分析用户在数据管理中的信息要求、处理要求、安全性与完整性要求。需求分析的方法:调查组织机构情况、各部门的业务活动情况、协助用户明确对新系统的各种要求、确定新系统的边界。常用的调查方法有: 跟班作业、开调查会、请专人介绍、询问、设计调查表请用户填写、查阅记录。分析和表达用户需求的方法:主要包括自顶向下和自底向上两类方法。采用逐层分解的方式分析系统,并把每一层用数据流图和数据字典描述。数据流图(data flow diagram,dfd)表达了数据和处理过程的关系。系统中的数据则借助数据字典(data dictionary,简称dd)来描述。2.2.2 概念结构设计阶段概念模型用于信息世界的建模。概念模型不依赖于某一个dbms支持的数据模型。通过对用户需求进行综合、归纳与抽象,形成一个独立于具体dbms的概念模型,可以用e-r图表示。概念模型可以转换为计算机上某一dbms支持的特定数据模型。概念模型特点:1) 具有较强的语义表达能力,能够方便、直接地表达应用中的各种语义知识。2) 应该简单、清晰、易于用户理解,是用户与数据库设计人员之间进行交流的语言。2.2.3 逻辑设计阶段将概念结构转换为某个dbms所支持的数据模型(例如关系模型),并对其进行优化。将e-r图转换为关系模型实际上就是要将实体、实体的属性和实体之间的联系转化为关系模式,这种转换一般遵循如下原则:一个实体型转换为一个关系模式,实体的属性就是关系的属性,实体的码就是关系的码。一个多对多的联系转换为一个关系模式,两个实体的码和联系本身的属性就是关系的属性,两个实体的码就是关系的码。数据模型的优化,确定数据依赖,消除冗余的联系,确定各关系模式分别属于第几范式。确定是否要对它们进行合并或分解。一般来说将关系分解为3nf的标准。2.2.4 物理设计阶段为逻辑数据模型选取一个最适合应用环境的物理结构(包括存储结构和存取方法)。根据dbms特点和处理的需要,进行物理存储安排,设计索引,形成数据库内模式。2.2.5 数据库实施阶段运用dbms提供的数据语言(例如sql)及其宿主语言(例如c),根据逻辑设计和物理设计的结果建立数据库,编制与调试应用程序,组织数据入库,并进行试运行。 数据库实施主要包括以下工作:用ddl定义数据库结构、组织数据入库 、编制与调试应用程序、数据库试运行。2.2.6 数据库运行维护阶段在数据库系统运行过程中必须不断地对其进行评价、调整与修改。内容包括:数据库的转储和恢复、数据库的安全性、完整性控制、数据库性能的监督、分析和改进、数据库的重组织和重构造。2.2.7 建模工具为加快数据库设计速度,目前有很多数据库辅助工具(case工具),如rational公司的rational rose,ca公司的erwin和bpwin,sybase公司的powerdesigner以及oracle公司的oracle designer等。第3章 数据库设计规范3.1 数据库规范化的五个要求3.1.1 要求一:表中应该避免可为空的列 虽然表中允许空列,但是,空字段是一种比较特殊的数据类型。数据库在处理的时候,需要进行特殊的处理。如此的话,就会增加数据库处理记录的复杂性。当表中有比较多的空字段时,在同等条件下,数据库处理的性能会降低许多。所以,虽然在数据库表设计的时候,允许表中具有空字段,但是,我们应该尽量避免。若确实需要的话,我们可以通过一些折中的方式,来处理这些空字段,让其对数据库性能的影响降低到最少。一是通过设置默认值的形式,来避免空字段的产生。二是若一张表中,允许为空的列比较多,接近表全部列数的三分之一。而且,这些列在大部分情况下,都是可有可无的。若数据库管理员遇到这种情况,建议另外建立一张副表,以保存这些列。然后通过关键字把主表跟这张副表关联起来。将数据存储在两个独立的表中使得主表的设计更为简单,同时也能够满足存储空值信息的需要。3.1.2 要求二:表不应该有重复的值或者列如进销存管理中,还需要对客户的联系人进行管理。而一个客户的联系人可能有多个,为了解决这个问题,有多种实现方式。若设计不合理的话在,则会导致重复的值或者列。我们可以这么设计,把客户信息、联系人都放入同一张表中。为了解决多个联系人的问题,可以设置第一联系人、第一联系人电话、第二联系人、第二联系人电话等等。若还有第三联系人、第四联系人等等,则往往还需要加入更多的字段。可是这么设计的话,会产生一系列的问题。如客户的采购员流动性比较大,在一年内换了六个采购员。直接修改又不利于追踪。所以,在数据库设计的时候要尽量避免这种重复的值或者列的产生。建议,若数据库管理员遇到这种情况,可以改变一下策略。如把客户联系人另外设置一张表。然后通过客户id把供应商信息表跟客户联系人信息表连接起来。也就是说,尽量将重复的值放置到一张独立的表中进行管理。然后通过视图或者其他手段把这些独立的表联系起来。3.1.3 要求三:表中记录应该有一个唯一的标识符在数据库表设计的时候,数据库管理员应该养成一个好习惯,用一个id号来唯一的标识行记录,而不要通过名字、编号等字段来对纪录进行区分。每个表都应该有一个id列,任何两个记录都不可以共享同一个id值。另外,这个id值最好有数据库来进行自动管理,而不要把这个任务给前台应用程序。否则的话,很容易产生id值不统一的情况。另外,在数据库设计的时候,最好还能够加入行号。id号是用户不能够维护的。但是,行号用户就可以维护。这是在实际应用程序设计中对id列的一个有效补充。3.1.4 要求四:数据库对象要有统一的前缀名一个比较复杂的应用系统,其对应的数据库表往往以千计。若让数据库管理员看到对象名就了解这个数据库对象所起的作用,恐怕会比较困难。而且在数据库对象引用的时候,数据库管理员也会为不能迅速找到所需要的数据库对象而头疼。建议:在开发数据库之前,最好能够花一定的时间,去制定一个数据库对象的前缀命名规范。最常用的是根据前台应用程序的模块来定义后台数据库对象前缀名。需要注意的是,这个命名规范应该在数据库管理员与前台应用程序开发者之间达成共识,并且严格按照这个命名规范来定义对象名。其次,表、视图、函数等最好也有统一的前缀。如视图可以用v为前缀,而函数则可以利用f为前缀。如此数据库管理员无论是在日常管理还是对象引用的时候,都能够在最短的时间内找到自己所需要的对象。3.1.5 要求五:尽量只存储单一实体类型的数据实体类型跟数据类型不是一回事,要注意区分。如现在有一个图书馆里系统,有图书基本信息、作者信息两个实体对象。若用户要把这两个实体对象信息放在同一张表中也是可以的。如可以把表设计成图书名字、图书作者等等。可是如此设计的话,会给后续的维护带来不少的麻烦。如当后续有图书出版时,则需要为每次出版的图书增加作者信息,这无疑会增加额外的存储空间,也会增加记录的长度。而且若作者的情况有所改变,如住址改变了以后,则还需要去更改每本书的记录。同时,若这个作者的图书从数据库中全部删除之后,这个作者的信息也就荡然无存了。很明显,这不符合数据库设计规范化的需求。遇到这种情况时,建议可以把上面这张表分解成三种独立的表,分别为图书基本信息表、作者基本信息表、图书与作者对应表等等。如此设计以后,以上遇到的所有问题就都引刃而解了。3.2 对象命名规范3.2.1 规则【规则-1】:oracle数据库对象的名字由字母、数字和一些连接符组成。1、多个单词之间用连接符分开,连接符用“_”字符,不建议使用其他的字符;2、例如:存储过程:sp_create_accbak_table【规则-2】:oracle数据库对象的名字长度不超过30个字符。1、如果超过30个字符,可以缩写,但一定要采用标准的缩写,常用标准缩写见附件。如果表或者是字段的名称仅有一个单词,那么建议不使用缩写,而是用完整的单词;2、例如:表:atp_para_cfg【规则-3】:在创建数据库对象时,不要使用引号。1、说明:oracle数据库自动转换为大写字符;避免使用系统保留字作为数据库对象的名称。2、例:建存储过程sp_set_process_status时写法正确写法:create or replace procedure sp_set_process_status end sp_set_process_status;错误写法:create or replace procedure “sp_set_process_status” end sp_set_process_status;3.2.2 表命名规范表的命名遵循数据库对象命名的一般规则:【规则-1】:要求表的命名尽量采用标准的翻译,能准确地表达该表的中文含义,能根据英文猜测到表的用途。例:gsm_user 用户资料表、user_imei 用户imei信息。【规则-2】对于一些特定作用的表,除了遵循普通表命名规范外,增加特定后缀表示。例:配置历史表表示为xxx_cfg_his。3.2.3 字段命名规范字段命名遵循数据库对象命名的一般规则: 【规则-1】:字段的命名由英文单词(或缩写)和下划线“_”组成,多个单词之间用下划线分开。例:user_id、package_code等。【规则-2】:要求字段名能表达字段的含义。例如:fail(fail):失败记录表history( his):历史identity(id):id号【规则-3】:字段长度,根据业务需要定义字典长度,对字符型字段,尽量用varchar2类型,不要用char、varchar类型。【规则-4】:如果相同字段在不同的表中出现,要使用相同的命名,且必须保证他们的类型和长度是相同的。例:gsm_user的字段gsm_user_id,和表user_package的字段gsm_user_id,长度和类型一致。3.2.4 索引命名规范【规则-1】:idx_表名缩写_字段名缩写。例:clerk_operating_detail表checkout_srl列上的索引命名:idx_cod_checkout_srl。【规则-2】:如果是复合索引,字段名缩写至少要包含复合索引的头两个字段名的缩写。例如:clerk_operating_detail表(operator_id,checkout_srl)列上的复合索引命名为:idx_cod_opid_chksrl;【规则-3】:如果是主键索引,以“pkx”为索引前缀。例:clerk_operating_detail表(operating_srl,code_county)上的主键索引命名为:pkx_cod_opsrl_codecty。【规则-4】:给表增加主键时要显式指定约束的名字,并且要指定using index tablespace 参数。例:alter table clerk_operating_detailadd constraint pkx_cod_opsrl_codecty -主键约束名,也是索引名primary key (operating_srl, code_county) using index tablespace ;不能写成alter table clerk_operating_detail add primary key (operating_srl, code_county);如果不显式指定约束名系统将随机分配一个约束名字(同时也是主键索引的名字) 如果不指定using index tablespace 参数,索引会建在该用户默认的表空间上,不利于数据库性能和系统维护。3.2.5 分区命名规范表名各单词第一个字母的缩写_p例1:bill_adjust_seq 表的分区名为:bas_p01bas_p13例2:按月份分区的分区分区命名:表名各单词第一个字母的缩写_p(年月),如clerk_operating_detail表分区名为:cod_p0507cod_p0512;注:cod是表的简称,0507是指2005年7月的分区。3.2.6 视图/物化视图命名规范【规则-1】:视图的命名规范遵循普通表的命名规范,并在视图前加上“v_”前缀,表示是视图。例:v_cardinfo。【规则-2】:物化视图命名规则:mv_源表名_源数据库。例:mv_gsm_user_11, mv_gsm_user_21, mv_gsm_user_41,分别表示从zwdb1,zwdb2和zwdb4复制过来的gsm_user表的数据。3.2.7 触发器/函数/存储过程命名规范【规则-1】:触发器的命名规则:trg_表名_说明:其中表名为触发源表名,ins/upd/del表示insert/update/delete触发器。例如:trg_msn_member_del,触发器的含义为:create or replace trigger ti_msn_member_delbefore delete on msn_member for each rowdeclare beginend【规则-2】:存储过程的命名以“sp_”打头说明:其他规范遵循普通表的命名规范,要求名字能表达存储过程的用途。例:sp_pre_score_modify、sp_create_scp_operation。【规则-3】:函数的命名以“fn_”打头说明:其他规范遵循普通表的命名规范,要求名字能表达函数的用途。例:fn_get_packname、fn_check_brand_package。3.3 数据库编程规范3.3.1 书写规范【规则-1】:所有代码统一使用小写字母书写。例:create or replace procedure sp_check_package( i_package_code number, i_user_id number, o_flag out number ) is begin o_flag := 0; end sp_check_package;/【规则-2】:确保变量和参数在类型和长度上与表数据列类型和长度相匹配。说明:如果与表数据列宽度不匹配,则当较宽或较大的数据传进来时会产生运行异常。【规则-3】:参数和变量的命名符合如下规范:1、传入参数以“i_”为前缀;2、传出参数以“o_”为前缀;3、变量以“v_”为前缀4、例如:create or replace procedure sp_get_global(i_operator_id in number, i_session_id in number, o_flag out number) is v_cityid varchar(2); v_region_level number(1);begin.end;【规则-4】:程序块中的begin、end独立成行。【规则-5】:程序块采用缩进风格书写,保证代码清晰易读,风格一致,缩进格数统一。例: beginupdate cfg_cdr_refresh set change_time=sysdate where cfg_type=5;if sql%rowcount = 0 theninsert into cfg_cdr_refresh(cfg_type,change_time,state)values(5,sysdate,0);end if; end trg_cfg_city_host_qry_all;【规则-6】:不允许把多个语句写在一行中,即一行只写一条语句。【规则-7】:同一条语句占用多于一行时,每行的第一个关键字应当左对齐,例:select * into v_gsm_user from gsm_userwhere msisdn = to_number(trim(i_phone_number)and user_city = i_city_id;【规则-8】:对于 insert values 和 update 语句,一行写一个字段,字段后面紧跟注释(注释语句左对齐),values 和 insert 左对齐,左括号和右括号与 insert、values 左对齐例:insert into table_name(user_id,-用户 id,主键user_name,-用户名login_name -登录名)values( v_user_id,v_user_name,v_login_name)【规则-9】:相对独立的程序块之间需加空行。例:-判断套餐是否可增加成员并获得专网标志 begin select use_date, decode(package_type, 1000, 1, 0) exceptionend;-如果为手机号码if i_number_type = 0 thenbegin end;【规则-10】:超过110列的语句要分行书写,长表达式应在低优先级操作符处换行,操作符或关键字放在新行之首。例:v_exchangeable_score := (v_score_phone_score + v_score_bounty_score + v_score_gift_score - v_score_alr_excg_score)+ (v_pre_score_phone_score + v_pre_score_bounty_score - v_pre_score_alr_excg_score)3.3.2 注释规范【规则-1】:所有变量定义都要加上注释,说明变量的用途及含义。例:create or replace procedure sp_sms_zoneas v_city number(2); -监控信息变量 v_db number(2); -数据库代码 v_total number(10) :=0; -发送总数 v_succ number(10) :=0; -成功数 v_fail number(10) :=0; -没有发送数 v_srl number(10) ; -记录流水o_flag number; -调用sp_send_query_sms返回的标识 end sp_sms_zone;/【规则-2】:注释内容要清晰、明了,含义准确,防止注释二义性。例:正确:ret_code out integer,-返回代码(0 成功 ,其它:错误,参见:错误代码定义);错误:ret_code out integer,-返回代码【规则-3】:对存储过程的任何修改,都需要在注释最后添加修改人、修改日期及修改原因等信息。例:/*修改原因:修改积分兑换和积分转赠修改人:* 修改时间:2006-01-05*/【规则-4】:对程序分支必须书写注释。例:-如果为手机号码if i_number_type = 0 thenbegin end;【规则-5】:在代码的功能、意图层次上进行注释,帮助维护人员理解代码。例:case rdm_type1 when 1 then -积分奖励 . . when 2 then -扣减(停用) . . when 3 then -积分兑换 . .end case;【规则-6】:代码注释应放在描述的代码上方或右方相近位置,不可放在下面。例:-查询转出用户的积分信息sp_score_query( s_user_id, -用户id rdm_city_id, -地市id )【规则-7】:注释与所描述的内容进行同样的缩排。例:-未达到可兑换标准if v_score_change_flag=0 then -对于兑换类型为961的,取消1000分门限的限制。 if rdm_type2 = 961 or rdm_type2 = 962 then end if;end if;【规则-8】:函数应对返回的代码进行详细描述。例:create or replace function fn_check_brand_package( i_package number, i_user_id number, i_brand_id number := 0, i_pay_mode number := 0 ) return number isresult number(1):=0; -0表示没有限制 ,其他表示有品牌限制 end fn_check_brand_package;【规则-9】:在程序块的结束行右方加注释,以表示程序块结束。例:-未达到可兑换标准if v_score_change_flag=0 then end if;-未达到可兑换标准处理结束【规则-10】:统一文件头的注释。例:create or replace procedure sysmgmt.sp_encrypt3(i_pwdin varchar2,o_new_pwdout varchar2,o_flag out number) is /*功能描述:密码加密脚本,本存储过程用于把指定的明文密码转化为密文参数描述:pwd:输入明文密码,new_pwd:输出的密文,o_flag:输出结果的状态(0:right,1:error)修改历史: 2005-12-28 *,修改加密方式为密钥方式; 2005-05-16 *,修改加密算法;2005-01-01 *,创建脚本;*/bl1varchar(1);bl2varchar(1);begin end;3.3.3 语法规范【规则-1】:存储过程的in、out参数应按类别分开书写,不要交叉。例:create or replace procedure sp_create_scp( i_gsm_user_id number, -用户号码 i_order_code number, -命令代码 i_operation_type number, -工单类型 i_operating_srl number, -操作流水 o_operation_srl out number, -工单流水(返回参数) o_flag out number, -成功 0 ,失败 1 o_msg out varchar2 )begin end;【规则-2】:存储过程中变量的声明应集中在is和begin关键字之间申明例:create or replace procedure sp_create_scp( )is v_user gsm_user%rowtype; -用户信息 v_value varchar2(30); ncnt number(5):=0; npriority number(2):=0;begin end;【规则-3】:尽可能使用相关表字段类型来定义相关的变量,如%type,%rowtype。说明:一般变量,都可能会用于表的查询条件,或增加记录的值;当字段数据类型发生变更时,对应的变量无需修改。例:v_user gsm_user%rowtype; -用户信息select * from gsm_user where gsm_user_id = v_user;当gsm_usre_id的类型变成字符型时,该段代码无需修改。【规则-4】:确保所有的变量和参数都用到,没有用到的变量和参数要删除。【规则-5】:存储过程有多个分支返回时,若有事务控制,需确保各个分支都结束事务。异常时,应该在exception中捕捉异常,并进行事务处理。【规则-6】:存储过程:不要在异常部分,进行正常的业务处理。说明:从程序的易读性、易维护性考虑,不要在异常处理部分,包含正常的业务处理部分。例:(不好的写法)exceptionwhen no_data_found then-没有找到记录,则重新查找其他数据select * from .end;【规则-7】:原则上不要使用动态 sql,如果必须使用,需绑定变量,绑定变量写法:query_string :=select pr_template from bssp.bssp_process_template where process_id=:ora_process_id for update; execute immediate query_string into lob using 38880003;【规则-8】:代码中的异常捕获返回结果,要加上oracle的异常sqlerrm(oracle的一个session级的全局变量)。例:exception when others thenrollback; oresult :=1; omsg := others|substr(sqlerrm,200);end;【规则-10】:捕捉到异常后需要rollback回滚事务。例:exception when others thenrollback; oresult :=1; omsg := others|sqlerrm;end;3.3.4 sql性能规范3.3.4.1 批量操作,避免频繁使用commit频繁的commit会导致物理i/o增大,同时会产生log file sync等待,但长时间不提交将带来更多的性能问题。建议小于3秒的事务可以一次提交,大于3秒的操作尽可能3秒左右提交一次。实际应用中使用commit时必须保证事务的完整性。3.3.4.2 避免动态sql,要使用绑定变量方式为了不重复解析相同的sql语句,在第一次解析之后,oracle将sql语句缓存在内存中,当你执行一个sql语句时,如果它和之前的执行过的语句完全相同,oracle就能很快获得内存中相同语句的执行计划,然后就直接执行该语句,而不需要进行解析。如果没有使用绑定变量,虽然语句结构相同,但因传入的变量不一样导致语句不相同,oracle还是需要对每条结构相同的语句重新解析一遍,同时在内存中缓存该语句,导致共享池中存放了n条结构相同的语句,达不到共享的目的,又浪费了大量的内存空间,如果语句执行的太频繁,会导致数据库无法申请共享内存而出错。java代码示例:a. 未使用绑定变量:.try string ssql = select * from my_table where field=1; pstmt = connection.preparestatement(ssql); pstmt.executeupdate(); /执行动态sql语句 .b. 使用绑定变量:.trystring ssql = select * from my_table where field=?;pstmt = connection.preparestatement(ssql);pstmt.setstring(1, scode); /scode为传入变量 pstmt.executeupdate(); /执行动态sql语句 .c/c+代码示例a. 未使用绑定变量:/处理传入的参数,构造动态sql语句 sprintf(sztmp1, select to_char(apply_date, yyyymmddhh24miss), from user_smscall where (gsm_user_id = %s ) , ora_gsm_user_id); exec sql prepare sql from :sqlstmt; /prepare /定义游标exec sql declare user_smscall_cu_1 cursor for sql;exec sql open user_smscall_cu_1;b. 使用绑定变量:/处理传入的参数,构造动态sql语句 sprintf(sztmp1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论