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ù)免費閱讀

下載本文檔

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

文檔簡介

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

版本號:Ver1.0

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

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

oracle編碼規(guī)范

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

PAGE

50

-

變更歷史

操作

責任人

日期

版本

變更內(nèi)容

創(chuàng)建

李富華

2010-04-20

創(chuà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 游標語句

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è)計規(guī)范

14

4.1 一般表設(shè)計

14

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

15

4.3 索引設(shè)計原則

15

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

15

4.5 觸發(fā)器

15

4.6 視圖設(shè)計

15

4.7 性能優(yōu)化

16

5. 書寫規(guī)范

20

5.1 縮進風格

20

5.2 空格及換行

20

6. 注釋講明

21

6.1 一般性注釋

21

6.2 函數(shù)文本注釋

21

7. 異常規(guī)范

22

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

22

7.2 后臺驗證異常信息規(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

文檔介紹

文檔目的

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

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

文檔范圍

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

定義

參考資料

命名規(guī)范

一般規(guī)則

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

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

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

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

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

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

對象命名匯總表

對象

對象名

前綴

范例

描述

表(table)

t_<table>

t_user

表名長度原則上不超過25個字符;表、視圖、字段名中不出現(xiàn)復數(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

存儲過程(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

保存點(savepoint)

save_<table>

save_<transaction>

表的保存點

事務(wù)的保存點

事務(wù)(transaction)

trans_<transaction>

trans_insert_userinfo

字段(field)

create_date

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

游標(cursor)

cur_<名稱>

cur_user_info

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

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

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

用戶及角色

編碼規(guī)范

一般性規(guī)定

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

系統(tǒng)

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

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

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

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

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

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

一行有多列,超過80個字符時,基于列對齊原則,采納下行縮進。

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

CREATE語句

CREATETABLEt_dksz(

YHBSVARCHAR2(20)NOTNULL,

ZHGXDATE,

DKKHDVARCHAR2(24),

CONSTRAINTpk_dksz_yhbsPRIMARYKEY(YHBS)

)

SELECT語句

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

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

語句中嵌入逗號時,在逗號后面加一空格,當逗號是最后一個字符時,把它放在本行;

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

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

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

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

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

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

每個部分分行編寫,將每一行的第一個關(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)鍵字用大寫,列名和表名采納小寫;【推舉】

語句中嵌入逗號時,在逗號后面加一空格,當逗號是最后一個字符時,把它放在本行;

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

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

格式如下:【推舉】

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='???'

游標語句

格式如下:【推舉】

程序中使用顯示游標。格式如下

OPENcur_name;

LOOP

FETCHcur_into…;

EXITWHENcur_name%notfound;

<處理語句>…

ENDLOOP;

CLOSEcur_name;

IF語句

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

IF<條件表達式>THEN

<一條或多條語句>

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

<一條或多條語句>

ENDIF;

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

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

注意ELSIF的寫法;

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

例如:

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ù)情況會被滿足)

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)使用多個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<條件表達式>

<零條或多條語句>

ENDLOOP;

FOR循環(huán)語句

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

LOOP

<一條或多條語句>

ENDLOOP;

WHILE循環(huán)語句

WHILE<條件表達式>

LOOP

<一條或多條語句>

ENDLOOP;

程序塊規(guī)范

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

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

CREATEORREPLACEPROCEDUREp_get_userinfo

BEGIN

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

語法規(guī)范

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

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

例如:以下代碼不符合規(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īng)使用isnull或isnotnull或nvl函數(shù)進行比較。

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

ifv_user_name=nullthen

dbms_output.put_line(‘usernameisnull’);

endif;

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

ifv_user_nameisnullthen

dbms_output.put_line(‘usernameisnull’);

endif;

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

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

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

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

使用varchar2代替varchar類型。

當存儲過程有多個分支返回時,若有事務(wù),需確保各個分支都結(jié)束了事務(wù)。

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

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

原則上不要使用動態(tài)sql,假如非得使用運態(tài)sql,須綁定變量?!就婆e】

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

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

確保所的變量和參數(shù)都使用到?!就婆e】

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

例如:如fnd_users表user_name字符寬為50,當用戶名大于10時會報錯。

declare

v_user_namevarchar2(10);

begin

selectfu.user_name

intov_user_name

fromfnd_userfu

wherefu.user_id=p_user_id;

end;

當一個PL/SQL或SQL語句中涉及到多個表時,始終使用不名來限定字段名,這使其它人閱讀起來更方便,幸免了含議模糊的引用,其中能夠不名中清晰地推斷出表名。不名命名時,盡量避逸使用無意義的代號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è)計規(guī)范

一般表設(shè)計

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

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

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

依照性能需要,能夠適當可曾加冗余;

專門表設(shè)計原則

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

在分區(qū)表中不建議使用全局索引,因為trunc分區(qū)時會導致全局索引失效,造成難以維護。

索引設(shè)計原則

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

完整性設(shè)計原則

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

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

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

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

觸發(fā)器

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

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

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

視圖設(shè)計

盡量使用簡單的視圖,幸免使用復雜的視圖。

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

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

性能優(yōu)化

避名頻繁commit,尤其是把commit寫在循環(huán)體中每次循環(huá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ī)范

例如:當有A、B兩個結(jié)果集,當結(jié)果集B專門大時,A較小時,適用exists,如:

select*

froma

whereexists(select1frombwherea.column=b.column);

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

select*

froma

wherea.columnin(

selectb.column

fromb)

幸免不必要的排序

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

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

索引的規(guī)則:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

原則如下:

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

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

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

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

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

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

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

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

使用復合索引且第一個索引字段沒有出現(xiàn)在where中時,建議使用hint強制。

pl/sql使用短路徑法,當計算邏輯表達式,即:一旦確定后,pl/sql停止計算表達式?!就婆e】

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)加了字段也可不能使用引用了本表的存儲過程失效。

從表中同一筆記錄中獵取記錄的字段值,須使用同一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ī)范

縮進風格

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

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

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

空格及換行

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

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

v_count:=1;v_creation_date:=sysdate;

應(yīng)寫成:

v_count:=1;

v_creation_date:=sysdate;

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

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

begin、end獨立成行

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

beginnull;exceptionwhenothersthennull;end;

應(yīng)寫成:

begin

null;

exception

whenothersthen

null;

end;

注釋講明

一般性注釋

注釋盡可能簡潔、詳細而全面。

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

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

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

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

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

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

函數(shù)文本注釋

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

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

函數(shù)名稱:

功能描述:

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

輸出參數(shù):無

返回值:無

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

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

修改記錄

修改人員:

修改時刻:

修改內(nèi)容:

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

CREATE[ORREPLACE]PROCEDUREdfsp_xxx

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

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

在塊的每個要緊部分之前添加注釋

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

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

異常規(guī)范

pl/sql異常規(guī)范

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

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

--自定義異常

my_errEXCEPTION;

--拋出自定義異常

RAISEmy_err;

--異常節(jié)

EXCEPTION

WHENmy_errTHEN

<statements>

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

<statements>

WHENothersTHEN

<statements>

END;

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

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

例如

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;

后臺驗證異常信息規(guī)范

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

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

異常分為警告和錯誤兩類。

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

附錄

附一開發(fā)工具

Oracle開發(fā)工具使用?!就婆e】

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

項目組成員使用pl/sqldeveloper的美化器功能,選取統(tǒng)一的規(guī)則文件,自動美化。多人編寫的代碼具有相同的書寫格式,風格統(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)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論