《Oracle数据库开发规范.docx》由会员分享,可在线阅读,更多相关《Oracle数据库开发规范.docx(45页珍藏版)》请在课桌文档上搜索。
1、ORAC1.E数据库开发规范注:木规范基于ORAC1.EI0G。对于其他数据库以及ORAC1.E数据库其他的版本,本规范并不一定合适。目录目录错误!未定义书签。1:字符集、字段类型错误!未定义书签。1. 1:字符集错误!未定义书签。2. 2:字段类型错误!未定义书签。2:命名规范错误!未定义书签。3. 1:命名规则表错误!未定义书签。4. 2:命名规范:错误!未定义书签。3:书写规范错误!未定义书签。5. 1:缩进风格与对齐错误!未定义书签。6. 2:语句书写规则错误!未定义书签。7. 3:其他错误!未定义书签。4:表错误!未定义书签。5:触发器错误!未定义书签。6:主键和外键:错误!未定义书
2、签。7:索引错误!未定义书签。7.1:建立索引错误!未定义书签。7.2:使用索引错误!未定义书签。8:视图错误!未定义书签。9:存储过程和函数错误!未定义书签。10:注释规范错误!未定义书签。10.1:总则错误!未定义书签。10.2:存储过程、函数头注释错误!未定义书签。10.3:文献注释错误!未定义书签。11:脚本规范错误!未定义书签。12:SQ1.语句性能优化13:冗余信息14:异常解决附录错误!未定义书签错误!未定义书签错误!未定义书签错误!未定义书签错误!未定义书签数据库三个范式.1:字符集、字段类型1. 1:字符集ORAC1.E的数据库实例有2个字符集设立:数据库字符集和国家字符集。
3、 【规则数据库字符集设立为ZHS16GBK,国家字符集设立为A1.16UTF16。 【规则1-1-2不要试图修改数据库的字符集。假如需要不同字符集的数据库实例,那只能重新建立一个新的数据库实例。1.2:字段类型【规则1-2-1定长文本型字段都要声明char,不定长文本型字段都要声明成varchar2(假如的确需要,也可以使用nvarchar2)类型。 例如:Createtablet_test(namevarchar2(10),departmentnvarchar2(20);请注意,在ZHS16GBK字符集下,每一个汉字是占用2个字节,而每一个英文字母和符号占用一个字节。上面的name字段可以最
4、多存储5个汉字,或者是10个字母。而department字段可以最多保存20个字符,不管是汉字或者字母。 也可以如下声明:Createtablet_test(namevarchar2(10char),departmentvarchar2(20char);这样的话,不管是汉字或者是字母,name字段就可以保存最多10个字符,。【规则所有的日期型都要声明成文本型,形同:yyyyMMdd0其中,yyyy是4位数的年份,MM是两位数的月份,dd是两位数的日期。举例如下:20230U2表达2023年1月份12日【规则123】所有的时间型都要声明成文本型,形同:hh24:mi:sso其中,hh24表达是2
5、4进制的小时,mi是分钟,ss是秒数。举例如下:11:12:13表达11点12分13秒。 【规则2-2-3假如一个字段需要同时包含日期和时间,需要提成日期型和时间型两种类型的字段进行设计。 【规则124】bool型字段一律定义成Char(I)类型,0,表达false,,1表达true。同时需要在该字段上面加约束,使合法的取值只能是0,1。 【规则125】所有的整型字段都应当声明为number(n),n为整型字段有效长度。比如Createtablet_test(agenumber(3)字段age能存储从-999到999的数字。当然,可以在这个字段上加约束,以约束它只能保存正数。不要如以下的方式定
6、义整型:Createtablet_test(agenumber)o由于这样定义等价于:Createtablet_test(agenumber(38)很显然,这个字段定义得实在太大太大了。不仅没有必要,并且对数据库有负面影响。【规则126】所有的浮点数定义为:number(p,s),其中的P是表达精度,或者总位数,取138中数字。S是小数位数,合法值为:84-127。比如:Createtabletable1(salarynumber(8,2)这个Salary字段表达,精确到小数点后面2位,总共最多有8位数字,这样算来,在小数点前面,最多能有6位数字。这个字段能表达的最大正数是999999.99,
7、最大负数是-999999.99。【规则127】假如一个字段保存的是一系列的编码(枚举型),则该字段必须定义成文本型。字段中保存的是大写字母。举例如下:CUStomer表格有一个字段CUStomejlype,该字段相应的是客户的类型编码,字段类型是Chal(1),其中,N表达普通客户,表达VlP客户。同时必须增长约束,以保证枚举选择以外的值不能被插入。【规则128】如无特殊需求,避免使用大字段(blob,clob,long,text,image等)。假如需要使用大字段,可以先考虑Blob。2:命名规范2.1:命名规则表对象名前缀范例描叙数据库实例无sale_test表空间ts_ts_user表t
8、ablet_t_Customer表名原则上不超过24个字符分区表t_+分区描叙t_system_items_0612视图VieWv_V_Customer视图名原则上不超过24个字符序列sequences_Seq_t_Customer_id约束ckc_ckt_ckc_t_Customer_idckt_t_Customer对字段的约束前缀为ckc.对表的约束前缀为ckt一般索引idx_idxSamplemid位图索引11aidx_mapidx_sample_mid唯一索引unidx_unidx_sajnple_mid分区表本地索引ln_lnl_system_item_分区表全局索引g11-gn_s
9、ystem_item主键Pk_ak_pk_t_Customerak_1.Customer存储过程UP_upInsAgentccount函数Uf_uf_SeIMaxData包和包体Pkg_pkg_MngClt物化视图mv_mv_Customer数据库联接from_from_sale_test保存点spt_spt_wrp变量自定义记录类型rec_Typerec_itemis(item_idvarchar2(10);游标cur_Cursorcur_itemsis局部变量1_l_item输入变量i_i_itme输出变量o_ojtme输入输出变量io_io_item2.2:命名规范: 【规则22“】所有
10、用户自定义的数据库对象名统一使用小写字母。 【规则222】命名尽量采用富故意义的英文词汇,不要采用汉语拼音。 示例:以下书写不符合规范(物料编码表) 应如下命名: 【规则223】所有名称采用英文单数名词或动词,避免出现复数。 【规则224假如键是主键,用表格名再加前缀pk_的方式命名。假如长度超过30个字符,则对表格名进行缩写。 【规则2-2-5假如键是备选主键,用表格名再加前缀ak_的方式命名。假如长度超过30个字符,则对表格名进行缩写。 【规则2-2-6假如是主键字段,统一命名为:Id;假如是保存其他表上的主键字段则用缩写加“Id”的方法命名。举例如下: 销售订单的编号字段命名:SalOr
11、dId;主键则命名为:Id。 【规则2-2-7存储过程、函数、触发器、程序块中定义的变量和输入、输出参数在命名上有所区分。 变量名小写,局部变量名使用“1.开头。用1.前缀代表输入参数变量,用。_前缀代表输出参数变量,用i。前缀代表输入输出参数变量。【规则228当一个单词不可以表达对象的函义时,用词组组合,假如组合太长时,采用简写或缩写,缩写要基本能表达原单词的意义。标记符应当直观且可以拼读,可望文知意。 例如,下面的命名就很合适l_minValuenumber;1_maxValuenumber;procedureup_setValue(.);【规则2-2-9变量和参数用小写字母开头的单词组合
12、而成示例:1JtemNumbernumber;【规则2-2-10变量的名字应当使用“名词”或者“形容词+名词”示例1JtemVaIuenumber;【规则2-2-11存储过程名字应当使用“动词”或者“动词+名词”(动宾词组)示例procedureup_setValue(.); 【规则2212当一个单词不可以表达对象的函义时,用词组组合,假如组合太长时,采用简写或缩写,缩写要基本能表达原单词的意义。原则上一方面要考虑的是需要清楚的表达命名所要表达的含义,另一方面才是考虑长度不要太长。 【规则2-2-13分区表的表名可以遵循普通表的正常命名规则。 【规则2214】准时间范围分区(每有一个分区),分
13、区名字为表的重要用途的缩写+下划线+yymm示例:库存交易分区表的分区命名可以采用如下方式:示例trans_0611、trans_0612trans_0701、trans_0702【规则2-2-15最小分区名字为before_data,最大分区名字为after_data.3:书写规范3.1:缩进风格与对齐 【规则311】:程序块采用缩进风格书写,保证代码清楚易读,风格一致,缩进格数统一为4个。 【规则312同一条语句占用多于一行时,从第二行开始第一个关键字应当空4格。示例:selectfieldl,field2,.fromt_tablenamewherefield11【规则3-1-3对于Ins
14、ertvalues和update语句,行写一个字段,这段后面紧跟注释(注释语句左对齐),values和insert左对齐,左括号和右括号与insert、values左对齐。示例:insertintot_user(user_id,-用户ID,主键user_name,-用户名login_name-登录名)values(i_user_id,1_user_name,i_login_name3.2:语句书写规则【规则3-2-1一行代码只做一件事情,如只定义一个变量或几个同类型且密切相关的变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。 示例:以下书写不符合规范:l_count:=1;l_cr
15、eation_date:=sysdate; 应写成:l_count:=1;l_creation_date:=sysdate;【规则322】建议:假如一行能将SQ1.语句所有容纳下,可以把语句放在一行,否则句子要在关键字和谓词处适当换行,以增长可读性。 示例:稍微短点的SQ1.语句可以这样写:selectduty_id,duty_namefromsm_dutywhereduty_id=:duty_id 长的应当写成:selectdutyjd,date,duty_namefromt_dutywhereduty_id=:duty_idanddatet20230206,; 【规则323】:begine
16、nd、if、else等关键字独立成行示例:以下不符合规范beginnull;exceptionwhenothersthennull;end;应写成:beginexceptionwhenothersthenend: 【规则32-4】参考(3-2-4)if后的条件要用括号括起来,括号内每行最多两个条件。示例:if(v_count=1orv_count=2orv_count=5orv_count=6)thenselectsysdateintol_datefromdual;endif; 【规则325】不同类型的操作符混合使用时,使用括号进行隔离,以使代码清楚。示例:以下书写不符合规范:iftabc,d
17、ef,=abcdethenendif;规范的写法是:if(tabc,dc)abcdcf,thenendif; 【规则3261连接符OR、IN、AND、以及=、=等前后加上一个空格。 【规则3-2-7不要将空的变量值直接与比较运算符(符号)比较。假如变量也许为空,应使用isnull或isnotnull或nvl函数进行比较。 示例:以下代码不符合规范,会得到错误结果ifv_user_name=nullthendbms_output.putline(usernameisnul);endif; 应当如下书写:ifv_user_nameisnullthendbms_output.put_lineCusc
18、rnameisnull5);endif;【规则3-2-8避免使用select语句。说明:不要用【规则329保证变量和参数在类型和长度与表数据列类型和长度相一致。为了保证一致,定义参数的类型尽量使用锚定的声明。示例declare来代替所有字段,应给出字段列表,注:不包含SeleCtCOUn(*). 示例:以下不符合规范:select*fromt_duty 应如下书写:selectduty_id,duty_name,creation_date,created_byfromt_dutyv_user_namet_user.fu.user_name%type;beginselectuser_namein
19、tol_user_namefromt_userwhereuser_id=i_user_id;end【规则3210常量定义在包头部,并使用大写命名。比如,圆周率:PInumber(8,7):=3.1415926;3.3:其他【规则3-3-1避免隐式的数据类型转换。说明:在书写代码时,必须拟定表的结构和表中各个字段的数据类型,特别是书写查询条件时的字段就更要注意了。 示例:以下代码不符合规范,StalusJype是number型数据.selectwip_entity_idfromCdiscreteJobswherestatus=3; 应如下书写:selectwip_entity_idfroml_d
20、iscrete_jobswherestatus=3;【规则332:对于非常复杂的sql(特别是多层嵌套,带子句或相关的查询),应当先考虑是否设计不妥引起的,对于复杂的一些SqI可以考虑使用程序实现,原则上遵循一句话只做一件事情。不要在数据层包含业务逻辑。4:表【规则41】表的命名请参考第2节。【规则4-2】其索引所在空间为表空间名+index。如:默认的表空间假如为ts-user,则所相应的索引空间为ts_user_index【规则4-3每个表在创建时候,必须显式指定所在的表空间,不要采用默认表空间。对于事务比较繁忙的数据表,必须存放在在该表专用空间中。5:触发器【规则5-1在数据库的开发中不
21、要使用触发器。6:主键和外键:6.1 :主键 【规则6-1-1主键命名规则请参考第2节。 【规则6-1-2所有的数据表都要有主键。 【规则6-1-3尽量不让主键具有可更新性。在拟定采用什么字段作为表的键的时候,小心用户将要编辑的字段。通常的情况下不要选择用户可编辑的字段作为键。 【规则6-1-5主键的选择,可以有下面3种:1:数据库的某个唯一性字段,假如是这个情况,必须非常小心。2:数据库序列。3:组合键。6. 2:外键 【规则6-2-1外键命名规则请参考第2节。 【规则6-2-2数据模型上面需要有外键。【规则623】运营的生产数据库不要使用外键。数据的致性可以由程序来保证。7:索引7. 1:
22、建立索引 【规则711】索引的命名请参考第2节。 【规则74-2】建议:每个索引在创建时,必须指定索引专用表空间,不要采用默认表空间,以分离索引和数据。 【规则7-1-3只在需要的地方建立合适的索引,尽也许少建索引。在很多情况下,建立的索引是不会被优化器使用的。而无用的索引会严重影响数据库的性能。所以应当合适的选择建立索引的列。下面的情况一般认为比较合适建立索引:经常出现在where子句中的列上可以建立索引。选择性比较高的列上可以建立索引。 【规则744】合适的建立复合索引,复合索引的第一个字段应当是在Where子句中出现最频繁、选择性较好的列。 【规则7-1-5】假如复合索引所包含的字段超过
23、3个,那么仔细考虑其必要性,考虑减少复合的字段。 【规则7-1-5一般情况下不要使用函数索引。7. 2:使用索引【规则721】任何对列的操作都也许导致全表扫描。这里所谓的操作涉及数据库函数、计算表达式等等,查询时要尽也许将操作移至等式的右边,甚至去掉函数。假如在【ablel(COII)上面有一个索引,那么下面的查询语句select【规则724】使用复合索引且第一个索引字段没有出现在Where中时,建议使用hint强制。比如:假如在表emp中有一个索引idlonemp(ename,deptno),针对deptno字段进行搜索一般是不会使用索引的。这个时候,可以使用下面的语法强制优化器使用索引。s
24、elect/*+index(empid1)*fromempwheredeptno=2请注意:这样的语法要比较慎重。刚开始的时候不要这样使用,一般只在数据库后期优化的时候可以这样使用。由于优化器一般来说是比较“聪明”的,它选择的一般情况下都是COST最小的途径,假如强制使用索引不妥,有也许还会使性能下降。fromtable1wherecoll+2=10;就不会考虑使用索引,假如改写成下面的完全等价的写法:select*fromtable1wherecoll=8;那么优化器会偏向与使用索引。【规则7-2-2ORAC1.E提供了基于函数的索引。createindextablel_idxlontabl
25、e1(upper(col1);这样,下面的查询就会倾向于使用索引。selectcol3fromtable1whereupper(coll)=,ABC,;【规则7-2-3搜索条件中有“isnull、“!=”notin”这样的条件,将肯定不会使用索引。所以假如也许的话应当尽量使用其他的等效写法来代替“isnu11、“!=”“notin”这样的条件。8:视图 【规则81】视图的命名规则请参考第2节建立视图的目的1:为了达成权限控制。2:实现简朴的外连接。3:简朴常用的UNION。4:简化频繁使用的SQ1.查询语句。 【规则8-4】严禁将业务逻辑固定在视图中并联结过多的表。这样做事实上是一次将过多的业
26、务层逻辑交给数据库去做,在开发阶段省了事,但是会给数据库性能以及后期的维护带来很大的麻烦。9:存储过程和函数在说到存储过程和函数的时候,先简朴介绍一下包。Oracle中存储过程和函数的集合叫作包(PaCkages),一个包分为包头和包体,包头定义了存储过程的名称和参数,包体除了名称和参数,还包存储过程的所有语句;几个存储过程可以组成一个包。示例:包头的定义createorreplacepackagemyTest_pkgistypecur_outisrefcursor;procedurewriteCount(i_codeidint.atype);proceduretestSandyInSert(
27、i_codeidinnvarchar2,o_countsoutnumber);endmyTest;包体的定义createorreplacepackagebodymyTest_pkgisprocedurewriteCount(1.codeidinnvarchar2)isv_countnumber;beginm_count:=0;selectcount(1)intov_countfromcodewherecode_id=codeid_p;dbms_oUtPUt.putJne(输入参数是llCodeid_p);dbms_output.put_line(查询结果是|v_coun。;end;endwri
28、teCount;proceduretestSandyInSert(i_codeidinnvarchar2,o-countsoutnumber)is1_curcur_out;1_code_snnvarchar2(50);1code_idnvarchar2(50);1_fbrnumber:=O;begincounts_p:=O;opencurforselectcode_sn,i_code_id,code_namefromcodewherecode_id=codeid_p;loopfetchm_curintol_code_sn,I_code_id,1_code_name;exitwhenm_cur%
29、notfbund;endloop/oooooooooooclosev_cur;endIestSandyInSert;endmyTest_pkg; 【规则9n存储过程和函数的命名、书写规则请参考第一、二节 【规则9-2所有的函数和存储过程都必包含在某一个特定包中,不要产生游历于所有包以外的函数或者存储过程。 【规则9-3定义参数的类型尽量使用锚定的声明。%type例如,定义一个变量1.dae它的类型与表job_history的Star1.date字段是相同类型(varchar2(8),请不要这样定义:1.datevarchar2(8),需要用如下的方式定义:l_datejob_history.s
30、tart_date%type, 【规则94】存储过程或者函数的接口参数必须显示标明是传入参数还是传出参数,同时,传入参数加前缀i_,传出参数加前缀o_,传入传出参数加io_。 【规则9-5存储过程中变量的声明应集中在as和begin关键字之间,不允许在代码中随意定义变量,定义变量时,完毕相同功能模块的变量应放在一起,与不同模块的变形量应空行隔开,增长代码的可读性。 【规则9-6事务必须显式提交或者取消,不要采用隐式提交或者自动提交。 【规则97】当存储过程和函数有多个分支返回时,若有事务,需保证各个分支都结束事务。 【规则98】对于存储过程、函数等程序块必须要有异常解决部分,以提高程序的自检能
31、力,异常尽也许就近解决。例如beginexceptionwhenexcep-namelthenwhenexcep-name2thenwhenothersthenend;没有合适异常解决的代码是不允许出现在生产数据库中的。 【规则9-9存储过程和函数代码中不要使用goto语句。说明:很显然,使用gol。语句是一种不极其好的编码风格。 【规则9-10存储过程和函数中要保证所的变量和参数都使用到。说明:申明变量等也要一定的系统开销,假如申明无用的变量,也显得代码不够严谨,并且它还会影响到任何后来阅读代码者的思绪。 【规则9-11存储过程和函数不宜过大,一般程序行不要超过150行。过大的存储过程或者函
32、数可以考虑拆分。 【规则9-12假如在函数或者存储过程中使用了动态SQ1.,则一定要使用绑定变量。具体请看demo中8createPackpkg_some_business.sql的存储过程up_do_SOmjbUSiness。【规则913供别的文献或函数调用的函数,不应使用全局变量互换数据。10:注释规范101:总则 【规则注释内容要清楚、明了、含义准确,防止注释二义性 【规则10-1-2严禁在注释中使用缩写,特别是非常用的缩写。说明:注释就是要写清楚给别人看的,假如使用缩写则不太容易表达清楚,并且有时候会有歧义。在使用缩写时或之前,应进行必要的说明。 【规则10-1-3一般情况下,源程序有
33、效注释量须在30%以上。说明:注释的原则是有助于对程序阅读理解,在该加的地方都加了,注释不宜太多也不能太少,注释语言须准确、易懂、简洁。一般来说,30%的注释才干把程序大约说清楚。所以30%应当是个下限。10.2:存储过程、函数头注释【规则存储过程、函数头的注释。示例:使用以下书写规范:(注意:开发人员可以直接CoPY这段注释到自己的代码中,然后进行相应内容条目的修改既可。)name:Jinser1.userPUrPOSe:向sm_users表中写入一条记录revsions:verdateauthordescription1.0.02023.10.01Tang1.创建此存储过程1.0.1202
34、3.12.01Tang1.增长hint1.2.02023.01.01Tang1.增长传入参数2.增长用户名校验过程parameters:p_user_nameinvarchar2新增用户名p_passwordinvarchar2新增用户的加密密码p_diabled_dateindate新增用户的过期时间p_created_byinnumber新增用户的操作人p_password_cyleinnumber密码更改周期x_messageoutvarchar2执行异常时返回的错误信息retum:0成功-1失败notes:1 .本函在前台调用,系统后台会自动地为IaS1.UPdated_by、last
35、_update_datecreation_date赋值.*求*木*w说明:name:函数或过程的名称PUrPSe:函数或过程的用途revisions下面是版本信息ver:当前版本date:创建或修改H期author:创建人或修改人parameters:对传入和传出参数进行说明return:函数返回结果notes:使用该函数或过程时需要特别注意的事情,假如没有可以不写。10. 3:文献注释 【规则10-34所有变量定义需要加注释,说明该变量的用途和含义。 【规则10-3-2对存储过程、函数的任何修改,都需要在注释最后添加修改人、修改日期及修改因素等信息。 【规则10-3-3对程序分支必须书写注释
36、。说明:这些语句往往是程序实现某一特定功能的关键,对于维护人员来说,良好的注释帮助更好的理解程序,有时甚至优于看设计文档。 【规则10-3-5注释应与其描述的代码相似,对代码注释应放在其上方或右方(对单条语句的注释)相近位置,不可放在下面。下面的书写就不规范。selectUSeJname,disabled_dateintov_user,v_disabled_datefromsm_userssuwheresu.userjd=p_user_id;-取得用户的失效时间应当如下书写:-取得用户的失效时间selectuser_name,disabled_dateintov_user_name,v_dis
37、abled_datefromsm_userssuwheresu.user_id=p_user_id; 【规则10-3-6注释与所描述的内容进行同样的缩排。 【建议10-3-8函数应对返回的代码进行具体描述。 【建议1039凡是涉及到类型的参数,建议在注释中把类型说明所有逻列出来。 【建议10310尽量使用“一”进行行注释。 【建议10-3-11行尾注释须使用“”。 【建议10312避免在一行代码或表达式的中间插入注释。 【规则10314】注释用中文书写(考虑到开发人员英语水平的不同,为了提高代码以及注释的可读性,使用中文可以做到沟通代价最小)。【规则2103-15】反复:代码需要注释说明。11
38、:脚本规范 【规则11-1所有脚本按内容分开存放,并按以下命名和存储:1:创建用户脚本,创建表空间脚本创建表空间脚本1createTablespace.sql创建用户脚本2crealeUser.sql2:创建业务表脚本,创建索引脚本创建业务表脚本命名3creaieTable.sql创建索引脚本:4createlndex.sql3:创建临时表脚本创建临时表脚本ScreateTempTable.sql4:创建数据库联结脚本创建数据库联结脚本6createDB1.ink.sql5:创建视图脚本创建视图脚7createView.sql6:创建包脚本创建一个目录:ScreatePack,在这个目录下面包
39、含所有的创建包的脚本.包文献的文献名应当等于:本包的名字+sql.每个包(涉及存储过程和函数)创建脚本单独保存。7:初始化数据脚本。初始化数据脚本:9initData.sql9:创建作业脚本创建作业脚本:10createJob.sql每一个脚本(或者目录)前面的数字说明了执行顺序。 【规则112在规则【规则11-1中的6:创建包脚本包脚本包含在8createPack目录下。对于这个目录下的脚本,假如脚本数量不多,就不用建立子目录。假如脚本数量很多,可以按照功能分模块建立子目录,把相应的脚本放到相应的子目录。在附件的demo中,ScreatePack下面就有2个模块,一个是buy_future,
40、一个是SaljfUtUre,下面分别存放了一些脚本。 【规则11-2创建每个对象代码的首部应当有对象注释。对于视图、临时表等对象,还应当注释清楚创建这个对象的目的,也就是这个对象实现了什么功能。 示例:-标准仓单表Createtabletable1 又如:-这个视图事实上是一个简朴的表连接查询。-它组合了Jjob_history,Jdepartment表的相关信息。createviewv_forqueryasselect11.start-date,t1.end_date,t2.department_namefromt_job_history11,t_departmentt2where11.de
41、partment-id=t2.id;12:SQ1.语句性能优化【规则12-1避免在WHERE字句中对列施以函数:selectitemfromservice_promotionwhereto_char(gmtmodifiedyyyy-mm-dd,)=20231-09-0;而应使用:selectitemfromservice_promotionwheregmt_modified=to-dateC2023-9-0yyyy-mm-dd,)andgmt_molifiedto_date(42023-9-02,yyyy-mm-dd,); 【规则2-21一定要使用绑定变量以JAVA为例,所有提交给数据库执行的
42、SQ1.语句应当如下面这样绑定变量。(Connectioncon=DriverManagengelConnection(jdbc:oracle:oci:database,scott,tiger);Conn.SelAutoCommiKfalse);/把自动提交修改为非自动提交。Stringv_sql=selectnamefromtable_awhereid=?,;/嵌入绑定变量ReparedStatementstmt=conn.prepareStatement(v_sql);stmt.setString(l,xxxx);为绑定变量赋值stmt.executeQuery();mit(); 【规则1
43、2-3不要频繁提交,不要使用自动提交以JAVA为例,任何与数据库事务相关的代码都应当是这样的:(Connectioncon=DriverManageEgetConnection(jdbc:oracle:oci:database,scott/,tigerH);conn.setAutoCommit(false)ffi自动提交修改为非自动提交。业务代码业务代码业务代码COmit。;/根据业务需求最后再一并提交。1注意,特别是不要将COmmiK)语句放在循环当中。笔者曾经不止一次的在网上看到所谓“ORAC1.E优化”的文章,里面说:“commit越频繁越好,越能加快释放资源,增长性能”。这样的文章事实
44、上是不对的。在别的主流数据库中,这个说法大多对的,但是在ORAC1.E不是这样的!在ORAC1.E数据库中,频繁的提交对数据库的性能正好是有负面效果的。对这点的具体说明,请参照ORAC1.E数据库开发优化指南.doc【规则125】尽量消除排序操作(假如可以的前提下)。排序操作是非常昂贵的。可以不使用。rderby,groupby的地方,尽量不要使用。同时假如可以使用UNIONA1.1.,那么就应当尽量不使用UNION操作。由于UNION操作会把连接的2张表分别进行排序以后将反复的记录剔除然后输出,而UNlONA1.1.就不会排序,也不会把反友记录消除。 【规则12-6尽量使用notexists来代替notin。说明:使用notexists,ORAC1.E将会更好的使用索引。selectempnofromempwheredcptnonotin(selectdeptnofromtest2);上