Oracle數(shù)據(jù)庫命名編碼規(guī)范_第1頁
Oracle數(shù)據(jù)庫命名編碼規(guī)范_第2頁
Oracle數(shù)據(jù)庫命名編碼規(guī)范_第3頁
Oracle數(shù)據(jù)庫命名編碼規(guī)范_第4頁
Oracle數(shù)據(jù)庫命名編碼規(guī)范_第5頁
已閱讀5頁,還剩46頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

文件標(biāo)識:QD-30-08密級:內(nèi)部

版本號:Ver1.0

大慶金橋軟件開發(fā)作業(yè)體系

Oracle數(shù)據(jù)庫命名編碼規(guī)范

oracle編碼規(guī)范

大慶金橋信息技術(shù)工程有限公司 -

PAGE

50

-

變更歷史

操作

責(zé)任人

日期

版本

變更內(nèi)容

創(chuàng)建

李富華

2010-04-20

創(chuàng)建文檔

編輯

周強(qiáng)

2010-04-21

修改文檔

目錄

1. 文檔介紹

4

1.1 文檔目的

4

1.2 文檔范圍

4

1.3 定義

4

1.4 參考資料

4

2. 命名規(guī)范

4

2.1 一般規(guī)則

4

2.2 對象命名匯總表

5

3. 編碼規(guī)范

6

3.1 一般性規(guī)定

6

3.2 CREATE語句

7

3.3 SELECT語句

7

3.4 INSERT語句

8

3.5 UPDATE語句

8

3.6 DELETE語句

9

3.7 游標(biāo)語句

9

3.8 IF語句

9

3.9 簡單循環(huán)語句

11

3.10 FOR循環(huán)語句

11

3.11 WHILE循環(huán)語句

11

3.12 程序塊規(guī)范

12

3.13 語法規(guī)范

12

4. 設(shè)計(jì)規(guī)范

14

4.1 一般表設(shè)計(jì)

14

4.2 專門表設(shè)計(jì)原則

15

4.3 索引設(shè)計(jì)原則

15

4.4 完整性設(shè)計(jì)原則

15

4.5 觸發(fā)器

15

4.6 視圖設(shè)計(jì)

15

4.7 性能優(yōu)化

16

5. 書寫規(guī)范

20

5.1 縮進(jìn)風(fēng)格

20

5.2 空格及換行

20

6. 注釋講明

21

6.1 一般性注釋

21

6.2 函數(shù)文本注釋

21

7. 異常規(guī)范

22

7.1 pl/sql異常規(guī)范

22

7.2 后臺(tái)驗(yàn)證異常信息規(guī)范

23

8. 附錄

23

8.1 附一開發(fā)工具

23

8.2 附二預(yù)定義異常

24

8.3 附三范式

25

8.3.1 第一范式

25

8.3.2 第二范式

25

8.3.3 第三范式

25

8.3.4 Boyce-Codd范式

26

8.3.5 第四范式

26

8.3.6 第五范式

26

8.3.7 反規(guī)范化

26

文檔介紹

文檔目的

本文檔用于指導(dǎo)開發(fā)設(shè)計(jì)人員對Oracle數(shù)據(jù)庫進(jìn)行設(shè)計(jì)和編碼。使用統(tǒng)一的命名和編碼規(guī)范,使數(shù)據(jù)庫對象命名及編碼風(fēng)格標(biāo)準(zhǔn)化,可增加程序的可讀性,增強(qiáng)系統(tǒng)的可維護(hù)性,提高軟件的質(zhì)量。

本文檔僅僅針對Oracle數(shù)據(jù)庫做的規(guī)范,對其他數(shù)據(jù)庫不具有指導(dǎo)意義。

文檔范圍

本規(guī)范適用于公司范圍內(nèi)所有以O(shè)racle作為后臺(tái)數(shù)據(jù)庫的應(yīng)用系統(tǒng)和項(xiàng)目開發(fā)工作。對公司2010年往常用Oracle數(shù)據(jù)庫開發(fā)的項(xiàng)目不做限制。

定義

參考資料

命名規(guī)范

一般規(guī)則

Oracle中的各種數(shù)據(jù)對象,包括實(shí)例、數(shù)據(jù)庫、表空間、表、視圖、存儲(chǔ)過程、函數(shù)、解發(fā)器等的命名都要遵循Oracle的標(biāo)準(zhǔn)命名規(guī)則:

以字符打頭,30個(gè)字符以內(nèi),名稱超過長度的情況下適當(dāng)采納縮寫。

只能包含A-Z,a-z,0-9,_。

不能和同一個(gè)表空間下的其他對象重名。

不能是Oracle服務(wù)器的保留字。

數(shù)據(jù)對象盡量不要使用縮寫;如要縮寫最好使用容易看明白的縮寫。

對象命名匯總表

對象

對象名

前綴

范例

描述

表(table)

t_<table>

t_user

表名長度原則上不超過25個(gè)字符;表、視圖、字段名中不出現(xiàn)復(fù)數(shù),創(chuàng)建表必須要注釋,comments必須要填寫。

視圖(view)

v_<table>

v_user

假如表名或字段名過長,則用表名或字段名的縮寫。

序列(sequence)

s_<table>

s_user

一般索引(normalindex)

i_<table>_<field>

i_user_username

field:字段名,遇上長字段名可采納縮寫

唯一索引(uniqueindex)

i_u_<table>_<field>

i_u_user_birthday

主鍵(primarykey)

pk_<table>_<field>

pk_user_userid

外鍵(foreignkey)

fk_<table>_<father_table>_<field>

fk_student_user_userid

簇(cluster)

cl_<table1>_<table2>

cl_user_student

觸發(fā)器(triger)

tr_i_<功能>

tr_u_<功能>

tr_d_<功能>

tr_iud_<功能>

tr_i_add_user_birthday

i:insert

u:update

d:delete

存儲(chǔ)過程(procedure)

p_i_<功能>

p_u_<功能>

p_d_<功能>

p_s_<功能>

p_i_user_birthday

函數(shù)(function)

f_<功能>

f_get_username_by_userid

包及包體(package&packagebody)

pkg_<功能>

pkg_user_info

類及類體(type&typebody)

type_<功能>

type_user_class

同義詞(synonym)

inv_<table>

inv_user

保存點(diǎn)(savepoint)

save_<table>

save_<transaction>

表的保存點(diǎn)

事務(wù)的保存點(diǎn)

事務(wù)(transaction)

trans_<transaction>

trans_insert_userinfo

字段(field)

create_date

單詞小寫,中間用下劃線隔開,字段必須要注釋,comments必須要填寫。

游標(biāo)(cursor)

cur_<名稱>

cur_user_info

數(shù)據(jù)庫鏈接(databaselink)

link_<服務(wù)器名>_<數(shù)據(jù)庫名>

若遠(yuǎn)程服務(wù)器名和數(shù)據(jù)庫名一致,采納link_<數(shù)據(jù)庫名>

用戶及角色

編碼規(guī)范

一般性規(guī)定

sql語句中的所有表名、字段名全部小寫,

系統(tǒng)

保留字、內(nèi)置函數(shù)名、sql保留字大寫?!就婆e】

連接符OR、IN、AND、以及=、<=、>=等前后各加上一個(gè)空格。當(dāng)語句中出現(xiàn)括號時(shí),括號的兩邊不留空格。

“不等于”統(tǒng)一使用"<>"。盡管"!="和"<>"是等價(jià)的,為了統(tǒng)一,不等于一律使用"<>"表示。

對較為復(fù)雜的sql語句加上注釋,講明算法、功能。

使用空行將邏輯相關(guān)的代碼段之間分隔開。

程序塊采納縮進(jìn)風(fēng)格書寫,保證代碼清晰易讀,風(fēng)格一致,縮進(jìn)格數(shù)統(tǒng)一為2個(gè)。必須使用空格,不同意使用TAB鍵,以免用不同的編輯器閱讀程序時(shí),因TAB鍵所設(shè)置的空格數(shù)目不同而造成程序布局不整齊。

一行有多列,超過80個(gè)字符時(shí),基于列對齊原則,采納下行縮進(jìn)。

where子句書寫時(shí),每個(gè)條件占一行,保留字或者連接符放到行的最后面,含有鍵的條件放到其他條件的前面。

CREATE語句

CREATETABLEt_dksz(

YHBSVARCHAR2(20)NOTNULL,

ZHGXDATE,

DKKHDVARCHAR2(24),

CONSTRAINTpk_dksz_yhbsPRIMARYKEY(YHBS)

)

SELECT語句

查詢語句采納以下原則編寫(可最大化重用共享池中的SQL語句,提高應(yīng)用程序性能):

由SELECT開頭,后跟一個(gè)顯示查詢結(jié)果的列表;【推舉】

語句中嵌入逗號時(shí),在逗號后面加一空格,當(dāng)逗號是最后一個(gè)字符時(shí),把它放在本行;

由FROM開頭,后跟一個(gè)或多個(gè)獵取數(shù)據(jù)所涉及的表,假如后面跟多個(gè)表,關(guān)鍵字右對齊;【推舉】

由WHERE開頭,后跟一個(gè)或多個(gè)確定所需值的條件,假如后面有多個(gè)條件,關(guān)鍵字右對齊;【推舉】

由GROUPBY開頭,后跟一個(gè)或多個(gè)表列名,通過這些列以對查詢結(jié)果進(jìn)行匯總,關(guān)鍵字右對齊;【推舉】

由ORDERBY開頭,后跟一個(gè)或多個(gè)表列名,通過這些列以對查詢結(jié)果進(jìn)行排序,關(guān)鍵字右對齊;【推舉】

當(dāng)語句中出現(xiàn)括號時(shí),括號的兩邊不留空格;

在SQL語句使用運(yùn)算符時(shí),操作兩邊應(yīng)各留一個(gè)空格;

每個(gè)部分分行編寫,將每一行的第一個(gè)關(guān)鍵字與第一行的SELECT尾部對齊;

例如:

SELECTcol1,col2,col3

FROMtable1

WHEREcol1>col2

GROUPBYcol1,col2

ORDERBYcol1;

SELECTcol1,col2,col3,col4,col5,col6,

col7,col8,col9,col10

FROMsb_sbqkxx,sb_bb011101

WHERE sb_sbqkxx.czwdbh=sb_bb.czwdbh

AND sb_sbqkxx.swdjbh=avc_swdjbh

AND sb_sbqkxx.sbsssq=avc_sbsssq;

INSERT語句

關(guān)鍵字用大寫,列名和表名采納小寫;【推舉】

語句中嵌入逗號時(shí),在逗號后面加一空格,當(dāng)逗號是最后一個(gè)字符時(shí),把它放在本行;

當(dāng)語句的同一部分要連續(xù)到下一行時(shí),按下列格式排列:

當(dāng)語句中出現(xiàn)括號時(shí),括號的兩邊不留空格。

格式如下:【推舉】

INSERTINTO<要插入的表名>

(<列1>,<列2>,..,<列n-1>,<列n>)

VALUES

(<列1值>,<列2值>,..,<列n-1值>,<列n值>)

例如:

insertintosm_user

(user_id,user_name,login_name)

values

(p_user_id,p_user_name,p_login_name)

insertintosm_duty_bak

(duty_id,duty_name,created_by,creation_date,last_updated_by,

last_update_date,disable_date)

select

duty_id,duty_name,created_by,creation_date,last_updated_by,

last_update_date,disable_date

fromsm_duty

whereduty_id=:duty_id

UPDATE語句

關(guān)鍵字右對齊;

格式如下:【推舉】

UPDATE<要更新的表名>

SET<要更新的列>=<列值>,

<要更新的列>=<列值>,

<要更新的列>=<列值>

DELETE語句

格式如下:【推舉】

DELETEFROMtable1

WHEREcol1='???'

游標(biāo)語句

格式如下:【推舉】

程序中使用顯示游標(biāo)。格式如下

OPENcur_name;

LOOP

FETCHcur_into…;

EXITWHENcur_name%notfound;

<處理語句>…

ENDLOOP;

CLOSEcur_name;

IF語句

條件執(zhí)行語句IF…ELSE按以下格式編寫:【推舉】

IF<條件表達(dá)式>THEN

<一條或多條語句>

[ELSE(或ELSIF<條件表達(dá)式>)THEN

<一條或多條語句>

ENDIF;

在IF…THEN和ELSE(或ELSIF)及ELSE…THEN和ENDIF間可包含一條或多條PL/SQL語句,而不需要加BEGIN和END

IF…ELSE…ENDIF語句能夠嵌套;

注意ELSIF的寫法;

if后的條件要用括號括起來,括號內(nèi)每行最多兩個(gè)條件。

例如:

if(v_count=1orv_count=2or

v_count=5orv_count=6)then

selectsysdate

intov_date

fromdual;

endif;

減少操縱語句的檢查次數(shù),如在else(if..else)操縱語句中,對最常用符合條件,盡量往前被檢查到。

例如:以下例如不符合規(guī)范(假設(shè)v_count=1條件大數(shù)情況會(huì)被滿足)

if(v_count=0)then

null;

elsif(v_count=1)then

null;

endif;

應(yīng)如下書寫:

if(v_count=1)then

null;

elsif(v_count=0)then

null;

endif;

盡量幸免使用嵌套的if語句,在這種情況應(yīng)使用多個(gè)if語句來推斷其可能。

例如:以下例如不符合規(guī)范

ifv_count=0then

ifv_flag=0then

null;

else

null;

endif;

elsev_count=1then

ifv_flag=0then

null;

else

null;

endif;

endif;

應(yīng)如下書寫:

if(v_count=0)and(v_flag=0)then

null;

elsif(v_count=0)and(v_flag=1)then

null;

elsif(v_count=1)and(v_flag=0)then

null;

elsif(v_count=1)and(v_flag=1)then

null;

endif;

簡單循環(huán)語句

LOOP

<零條或多條語句>

EXITWHEN<條件表達(dá)式>

<零條或多條語句>

ENDLOOP;

FOR循環(huán)語句

FOR變量IN[變量取值范圍]

LOOP

<一條或多條語句>

ENDLOOP;

WHILE循環(huán)語句

WHILE<條件表達(dá)式>

LOOP

<一條或多條語句>

ENDLOOP;

程序塊規(guī)范

在sql代碼塊中盡量使用begin...end語句塊,提高代碼可讀性。

關(guān)于觸發(fā)器、存儲(chǔ)過程、函數(shù)等帶名的程序塊,要使用塊結(jié)束標(biāo)識。

CREATEORREPLACEPROCEDUREp_get_userinfo

BEGIN

ENDp_get_userinfo;/*此處的過程名p_get_userinfo是可選的,規(guī)范要求寫上,與塊開始的CREATE相對應(yīng)*/

語法規(guī)范

幸免隱式的數(shù)據(jù)類型轉(zhuǎn)換。

講明:在書寫代碼時(shí),必須確定表的結(jié)構(gòu)和表中各個(gè)字段的數(shù)據(jù)類型,特不是書寫查詢條件時(shí)的字段就更要注意了。

例如:以下代碼不符合規(guī)范,status_type是number型數(shù)據(jù).

select

wdj.wip_entity_id

from

wip.wip_discrete_jobswdj

where

wdj.status=‘3’;

應(yīng)如下書寫:

select

wdj.wip_entity_id

from

wip.wip_discrete_jobswdj

where

wdj.status=3;

不要將空的變量值直接與比較運(yùn)算符(符號)比較。假如變量可能為空,應(yīng)使用isnull或isnotnull或nvl函數(shù)進(jìn)行比較。

例如:以下代碼不符合規(guī)范

ifv_user_name=nullthen

dbms_output.put_line(‘usernameisnull’);

endif;

應(yīng)該如下書寫:

ifv_user_nameisnullthen

dbms_output.put_line(‘usernameisnull’);

endif;

關(guān)于特不復(fù)雜的sql(特不是多層嵌套,帶子句或相關(guān)的查詢),應(yīng)該先考慮是否設(shè)計(jì)不當(dāng)引起的,關(guān)于復(fù)雜的一些sql能夠考慮使用程序?qū)崿F(xiàn),原則上遵循一句話只做一件情況。

盡可能地使用相關(guān)表字段的類型定義,形如%type、%rowtype。

存儲(chǔ)過程中變量的聲明應(yīng)集中在as和begin關(guān)鍵字之間,不同意在代碼中隨意定義變量,定義變量時(shí),完成相同功能模塊的變量應(yīng)放在一起,與不同模塊的變形量應(yīng)空行隔開,增加代碼的可讀性。

orderby后面字段不唯一時(shí)分頁會(huì)出現(xiàn)問題,分頁時(shí)假如orderby后面的字段不唯一,一定要讓orderby唯一,最佳方案是增加一pk,如實(shí)在沒方法則能夠追加rowid,orderby后盡量幸免使用rowid。

使用varchar2代替varchar類型。

當(dāng)存儲(chǔ)過程有多個(gè)分支返回時(shí),若有事務(wù),需確保各個(gè)分支都結(jié)束了事務(wù)。

in、out參數(shù)應(yīng)按類不分開書寫,不要交叉,關(guān)于out參數(shù),特不是nesttable、record,盡量都帶上nocopy,提高程序的運(yùn)行效率。

聚攏函數(shù)max、min、sum在沒有記錄得符合查詢條件的情況下返回null,可不能產(chǎn)生no_data_found異常。

原則上不要使用動(dòng)態(tài)sql,假如非得使用運(yùn)態(tài)sql,須綁定變量。【推舉】

盡量不要使用子函數(shù)方式實(shí)現(xiàn)存儲(chǔ)過程,應(yīng)分不定義?!就婆e】

代碼中不建議使用goto語句。【推舉】

確保所的變量和參數(shù)都使用到。【推舉】

確保變量和參數(shù)在類型和長度與表數(shù)據(jù)列類型和長度相匹配。假如與表數(shù)據(jù)列寬度不匹配,則當(dāng)較寬或較大的數(shù)據(jù)傳進(jìn)來時(shí)會(huì)產(chǎn)生運(yùn)行異常。

例如:如fnd_users表user_name字符寬為50,當(dāng)用戶名大于10時(shí)會(huì)報(bào)錯(cuò)。

declare

v_user_namevarchar2(10);

begin

selectfu.user_name

intov_user_name

fromfnd_userfu

wherefu.user_id=p_user_id;

end;

當(dāng)一個(gè)PL/SQL或SQL語句中涉及到多個(gè)表時(shí),始終使用不名來限定字段名,這使其它人閱讀起來更方便,幸免了含議模糊的引用,其中能夠不名中清晰地推斷出表名。不名命名時(shí),盡量避逸使用無意義的代號a、b、c…,而應(yīng)該有意義(如表system_items_b對應(yīng)不名為msi,po_headers_all不名對應(yīng)為pha)。

例如:以下編碼不符合規(guī)范:

select

wip_entity_name,a.wip_entity_id,a.date_released

from

wip.wip_entitiesb,

wip.wip_discrete_jobsa

where

b.wip_entity_id=a.wip_entity_idand

a.status_type=3and

a.date_released>trunc(sysdate)

應(yīng)如下書寫:

selectwe.wip_entity_name,wdj.wip_entity_id,wdj.date_released

fromwip.wip_entitieswe,

wip.wip_discrete_jobswdj

wherewe.wip_entity_id=wdj.wip_entity_id

andwdj.status_type=3

andwdj.date_released>trunc(sysdate)

設(shè)計(jì)規(guī)范

一般表設(shè)計(jì)

表空間設(shè)計(jì),原則上表空間名與schema名一致,其索引所在空間為schemaname+index。

如:schema為INV,則默認(rèn)的表空間應(yīng)該為INV,所對應(yīng)的索引空間為INVINDEX

tablespace——每個(gè)表在創(chuàng)建時(shí)候,必須指定所在的表空間,不要采納默認(rèn)表空間,以防止表建立在system空間上,導(dǎo)致性能問題。關(guān)于事務(wù)比較繁忙的數(shù)據(jù)表,必須存放在在該表專用空間中。

依照性能需要,能夠適當(dāng)可曾加冗余;

專門表設(shè)計(jì)原則

分區(qū)表——關(guān)于數(shù)據(jù)量比較大的表,依照表數(shù)據(jù)的屬性進(jìn)行分區(qū),以得到較好的性能。假如表按某些字段進(jìn)行增長,則采納按字段值范圍攻進(jìn)行分區(qū);假如表按某個(gè)字段的幾個(gè)關(guān)鍵值進(jìn)行分布,則采納列表分區(qū);關(guān)于靜態(tài)表,則采納hash分區(qū)或列表分區(qū);在范圍分區(qū)中,假如數(shù)據(jù)按某關(guān)鍵字段均衡分由,則采納子分區(qū)的復(fù)合分區(qū)法。

在分區(qū)表中不建議使用全局索引,因?yàn)閠runc分區(qū)時(shí)會(huì)導(dǎo)致全局索引失效,造成難以維護(hù)。

索引設(shè)計(jì)原則

每個(gè)索引在創(chuàng)建時(shí),必須指定表空間,不要采納默認(rèn)表空間,以防止索引建立在system空間和非索引專用空間,以減少IO沖突,提高性能。

完整性設(shè)計(jì)原則

主鍵約束——原則上所有的數(shù)據(jù)表都要有主鍵。關(guān)于數(shù)據(jù)量比較大的表,要求指定索引字段。

外鍵關(guān)聯(lián)——關(guān)于關(guān)聯(lián)兩個(gè)表字段,一般應(yīng)該分不建立主鍵、外鍵。實(shí)際是否建立外鍵,依照對數(shù)據(jù)完整性的要求決定。為了提高性能,關(guān)于數(shù)據(jù)量較大的表要求對外鍵建立索引。關(guān)于有要求級聯(lián)刪除屬性的外鍵,必須指定ondeletecascade.

Null值——關(guān)于字段能否為null,應(yīng)該在sql建表腳本中明確指定,不應(yīng)該使用缺省。由于null值在參加任何計(jì)算時(shí),結(jié)果均為null,因此在程序中必須用nvl()函數(shù)把可能為null值的字段或變量轉(zhuǎn)換非null的默認(rèn)值。

Check條件——關(guān)于字段有檢查性約束,需指定check原則。

觸發(fā)器

觸發(fā)器是一種專門的存儲(chǔ)過程,通過數(shù)據(jù)表的DML操作而觸發(fā)執(zhí)行,其作用為確保數(shù)據(jù)的完整性和一致性不被破壞而創(chuàng)建,實(shí)現(xiàn)數(shù)據(jù)的完整性約束。

講明:觸發(fā)器的before或after事務(wù)屬性的選擇時(shí)候,對表操作的事務(wù)屬性必須與應(yīng)用程序保持一致,以幸免死鎖發(fā)生,在大型導(dǎo)入表中,盡量幸免使用觸發(fā)器。

在系統(tǒng)中不要使用過多的觸發(fā)器。

視圖設(shè)計(jì)

盡量使用簡單的視圖,幸免使用復(fù)雜的視圖。

簡單視圖:數(shù)據(jù)來自單個(gè)表,且無分組(distinct/groupby)、無函數(shù)。

復(fù)雜視圖:數(shù)據(jù)來自多個(gè)表,或有分組、有函數(shù)。

性能優(yōu)化

避名頻繁commit,尤其是把commit寫在循環(huán)體中每次循環(huán)都進(jìn)行commit。

使用綁定變量,幸免常量的直接引用。

例如:以下書寫不符合本規(guī)范.

insertintosm_users(user_id,user_name,created_by,creation_date)values

(1,’Tang’,-1,sysdate);

建議用如下方式操作:

declare

v_user_idsm_users.user_id%type;

v_user_namesm_users_user_name%type;

v_created_bysm_users.created_by%type;

v_creation_datesm_users.creation_date%type;

begin

insertintosm_users(

user_id,

user_name,

created_by,

creation_date)

values(

v_user_id,

v_user_name,

v_created_by,

v_creation_date);

in、exists的使用規(guī)范

例如:當(dāng)有A、B兩個(gè)結(jié)果集,當(dāng)結(jié)果集B專門大時(shí),A較小時(shí),適用exists,如:

select*

froma

whereexists(select1frombwherea.column=b.column);

當(dāng)結(jié)果集A專門大時(shí),B專門小時(shí),適用in,如:

select*

froma

wherea.columnin(

selectb.column

fromb)

幸免不必要的排序

講明:對查詢結(jié)果進(jìn)行排序會(huì)大大的降低系統(tǒng)的性能。

關(guān)于數(shù)字型的唯一鍵值,用序列sequence產(chǎn)生。

索引的規(guī)則:

建立索引常用的原則如下:

1).表的主鍵、外鍵必須有索引

2).1000行的表應(yīng)該有索引

3).經(jīng)常與其它表進(jìn)行連接的表,在邊接字段上應(yīng)建立索引

4).經(jīng)常出現(xiàn)在where子句中的字段且過濾性極強(qiáng)的,特不是大表的字段,應(yīng)該建立索引

5).索引字段,盡量幸免值為null

6).復(fù)合索引的建立需要認(rèn)真分析;盡量考慮用單字段索引代替;

A. 正確選擇復(fù)合索引中的第一個(gè)字段,一般是選擇性較好的且在where子句中常的字段上;

B. 復(fù)合索引的幾個(gè)字段是否經(jīng)常同時(shí)以and方式出現(xiàn)在where子句中?單字段查詢是否極少其至沒有?假如是,則能夠建立復(fù)合索引;否則考慮單字段索引;

C. 假如復(fù)合索引中包含的字段經(jīng)常單獨(dú)出現(xiàn)在where子句中,則分解為多個(gè)單字段索引;

D. 假如復(fù)合索引所包含的字段超過3個(gè),那么認(rèn)真考慮其必要性,考慮減少復(fù)合的字段;

E. 假如既有單字段索引,又有這幾個(gè)字段上的復(fù)合索引,一般能夠刪除復(fù)合索引;

7).頻繁DDL的表,不要建立太多的索引;

8).刪除無用的索引,幸免對執(zhí)行打算造成負(fù)面阻礙;

讓SQL語句用上合理的索引。

原則如下:

首先,看是否用上了索引,關(guān)于該使用索引而沒有用上索引的SQL語句,應(yīng)該想方法用上索引。

其次,看是否用上了索引,特不復(fù)雜的SQL語句,當(dāng)其中where子句包含多個(gè)帶有索引的字段時(shí),更應(yīng)該注意索引的選擇是否合理。錯(cuò)誤的索引不僅可不能帶來性能的提高,相反往往導(dǎo)致性能的降低。

針對如何用上合理的索引,以O(shè)racle數(shù)據(jù)中的例子進(jìn)行講明:

任何對列的操作都可能導(dǎo)致全表掃描,那個(gè)地點(diǎn)所謂的操作包括數(shù)據(jù)庫函數(shù)、計(jì)算表達(dá)式等等,查詢時(shí)要盡可能將操作移至等式的右邊,甚至去掉函數(shù)。

幸免不必要的類型轉(zhuǎn)換,要了解“隱藏”的類型轉(zhuǎn)換。

增加查詢的范圍,限制全范圍的搜索。

索引選擇性低,但數(shù)據(jù)分布差異專門大時(shí),仍然能夠利用索引提高效率。

Oracle優(yōu)化器無法用上合理索引的情況下,利用hint強(qiáng)制指定索引。

使用復(fù)合索引且第一個(gè)索引字段沒有出現(xiàn)在where中時(shí),建議使用hint強(qiáng)制。

pl/sql使用短路徑法,當(dāng)計(jì)算邏輯表達(dá)式,即:一旦確定后,pl/sql停止計(jì)算表達(dá)式。【推舉】

notin的替換寫法【推舉】

例如:

selectdeptno

fromdept

wheredeptnonotin

(selectdeptnofromemp)

建議寫成:

selectdeptno

fromdept,emp

wheredept.deptno=emp.deptno(+)and

emp.deptnoisnull

like子句盡量前端匹配【推舉】

like參數(shù)使用得特不頻繁,因此假如能夠關(guān)于like子句使用索引,將專門好地提高查詢的效率。

例如:查詢都市代碼

select*

fromcity

wherecity_namelike‘%ZHEN%’

修改為

select*

fromcity

wherecity_namelike‘SHNEZHEN%’

幸免使用select*語句。

講明:不要用*來代替所有字段,應(yīng)給出字段列表,注:不包含selectcoun(*).例如:以下不符合規(guī)范:

insert語句必須給出字段列表,使用insert語句一定要給出要插入的字段列表,如此即使更改了表結(jié)構(gòu)加了字段也可不能使用引用了本表的存儲(chǔ)過程失效。

從表中同一筆記錄中獵取記錄的字段值,須使用同一SQL語句得到,不同意分多條SQL語句。

例如:以下不符合此規(guī)范

selectduty_id

intov_duty_id

fromsm_duty

whererownum=1;

selectduty_name

intov_duty_name

fromsm_duty

whererownum=2;

應(yīng)如下書寫:

selectduty_id,duty_name

intov_duty_id,v_duty_name

fromsm_duty

whererownum=1

書寫規(guī)范

縮進(jìn)風(fēng)格

程序塊采納縮進(jìn)風(fēng)格書寫,保證代碼清晰易讀,風(fēng)格一致,縮進(jìn)格數(shù)統(tǒng)一為2個(gè)。

必須使用空格,不同意使用TAB鍵。

具體語句參考“編碼規(guī)范”小節(jié)

空格及換行

不同意把多個(gè)語句寫在一行中,即一行只寫一條語句。

例如:以下書寫不符合規(guī)范:

v_count:=1;v_creation_date:=sysdate;

應(yīng)寫成:

v_count:=1;

v_creation_date:=sysdate;

相對獨(dú)立的程序塊之間必須加空行。兩個(gè)程序塊在邏輯上相對獨(dú)立,應(yīng)用空行加以分隔,同時(shí)增加注釋。

超過80列的語句要分行書寫,長表達(dá)式應(yīng)在低先級操作符處換行,操任符或關(guān)鍵字放在新行之首。劃分出新行應(yīng)當(dāng)適當(dāng)?shù)乜s進(jìn),使排版整齊,語句可讀。

begin、end獨(dú)立成行

例如:以下不符合規(guī)范

beginnull;exceptionwhenothersthennull;end;

應(yīng)寫成:

begin

null;

exception

whenothersthen

null;

end;

注釋講明

一般性注釋

注釋盡可能簡潔、詳細(xì)而全面。

創(chuàng)建每一數(shù)據(jù)庫對象時(shí)都要加上COMMENTON注釋,以講明該對象的功能和用途;建表時(shí),對某些數(shù)據(jù)列也要加上COMMENTON注釋,以講明該列和/或列取值的含義。如:XX表中有CZZT列屬性為NUMBER(10,0)可加COMMENTON注釋如下COMMENTONCOLUMNXX.CZZTIS'0=正常,1=等待,2=超時(shí),3=登出'

在pl/sql中,為每個(gè)變量聲明添加注釋,講明該變量用途。

在塊的每個(gè)要緊部分之前增加注釋,講明該段語句及算法的目的以及要得到的結(jié)果。

注釋語法包含兩種情況:單行注釋、多行注釋

單行注釋:注釋前有兩個(gè)連字符(--),一般對變量、條件子句能夠采納該類注釋。

多行注釋:符號/*和*/之間的內(nèi)容為注釋內(nèi)容。對某項(xiàng)完整的操作建議使用該類注釋。

函數(shù)文本注釋

在每一個(gè)塊和過程(存儲(chǔ)過程、函數(shù)、包、觸發(fā)器、視圖等)的開頭放置注釋。

/************************************************************************

函數(shù)名稱:

功能描述:

輸入?yún)?shù):

輸出參數(shù):無

返回值:無

創(chuàng)建者:<中文姓名>

創(chuàng)建時(shí)刻:2010-04-10

修改記錄

修改人員:

修改時(shí)刻:

修改內(nèi)容:

*************************************************************************/

CREATE[ORREPLACE]PROCEDUREdfsp_xxx

傳入?yún)?shù)的含義應(yīng)該有所講明。假如取值范圍確定,也應(yīng)該一并講明。取值有特定含義的變量(如boolean類型變量),應(yīng)給出每個(gè)值的含義。

在每一個(gè)變量聲明的旁邊添加注釋。講明該變量要用作什么,通常,簡單使用單行注釋就行了,例如l_sfhCHAR(11)--身份證號碼。

在塊的每個(gè)要緊部分之前添加注釋

在塊的每個(gè)要緊部分之前增加注釋,解釋下—組語句目的,最好是講明該段語句及算法的目的以及要得到的結(jié)果,但不要對其細(xì)節(jié)進(jìn)行過多的描述

在塊和過程的開頭注釋中還能夠增加要訪問的數(shù)據(jù)庫等信息

異常規(guī)范

pl/sql異常規(guī)范

關(guān)于存儲(chǔ)過程、函數(shù)等程序塊都要有異常處理部分,以提高程序的自檢能力。

異常節(jié)格式如下:

--自定義異常

my_errEXCEPTION;

--拋出自定義異常

RAISEmy_err;

--異常節(jié)

EXCEPTION

WHENmy_errTHEN

<statements>

WHENno_data_foundTHEN--系統(tǒng)預(yù)定義異常

<statements>

WHENothersTHEN

<statements>

END;

在異常節(jié)的最后都要設(shè)置others異常處理,它處理所有沒有明確列出的異常。

項(xiàng)目開發(fā)時(shí)期,為了調(diào)試方便、快速定位錯(cuò)誤,能夠創(chuàng)建xtycxx(系統(tǒng)異常信息)表,記錄產(chǎn)生系統(tǒng)異常的存儲(chǔ)過程或函數(shù)名、異常名,假如過程或函數(shù)中有多個(gè)程序塊,記錄塊的描述信息。

例如

EXCEPTION

WHENno_data_foundTHEN

INSERTINTOxtycxx

(ccmc,ycmc,ms)

VALUES(‘a(chǎn)p_name’,’no_data_found’,’獵取操作文檔編號’);

WHENothersTHEN

INSERTINTOxtycxx

(ccmc,ycmc,ms)

VALUES(‘a(chǎn)p_name’,’others’,’獵取操作文檔編號’);

RETURN;

END;

后臺(tái)驗(yàn)證異常信息規(guī)范

使用數(shù)據(jù)庫過程、函數(shù)進(jìn)行后臺(tái)數(shù)據(jù)驗(yàn)證時(shí),發(fā)覺異常情況,需要記錄異常,并返回到用戶界面。

異常信息描述要求簡潔、準(zhǔn)確、完整,揭示異常實(shí)質(zhì),準(zhǔn)確定位異常出現(xiàn)的位置。

異常分為警告和錯(cuò)誤兩類。

由于每個(gè)實(shí)際項(xiàng)目,業(yè)務(wù)不同,異常信息也變化專門大。每個(gè)項(xiàng)目開始時(shí)依照需求,統(tǒng)一進(jìn)行定義。

附錄

附一開發(fā)工具

Oracle開發(fā)工具使用。【推舉】

項(xiàng)目開發(fā)統(tǒng)一使用集成的開發(fā)環(huán)境pl/sqldeveloper作為開發(fā)工具,用于開發(fā)、測試、調(diào)試和優(yōu)化pl/sql存儲(chǔ)程序單元。

項(xiàng)目組成員使用pl/sqldeveloper的美化器功能,選取統(tǒng)一的規(guī)則文件,自動(dòng)美化。多人編寫的代碼具有相同的書寫格式,風(fēng)格統(tǒng)一。查詢語句還可最大化重用共享池中的sql語句,提高應(yīng)用程序性能。

以下工具能夠做為參考工具:

1、編碼工具:ultraedit-32全稱:UltraEdit–32ProfessionalText/HextEditor公司:IDMComputerSolutions,Inc.網(wǎng)址:/

2、測試工具:pl/sqldeveloper

全稱:pl/sqldeveloper

公司:AllroundAutomations

網(wǎng)址:/plsqldev.html

3、調(diào)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論