版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年綿陽職業(yè)技術(shù)學(xué)院單招職業(yè)傾向性考試題庫及參考答案詳解1套
- 2026年黃河交通學(xué)院單招綜合素質(zhì)考試題庫及答案詳解一套
- 2026年廣元中核職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫及參考答案詳解1套
- 2026年福建省三明市單招職業(yè)適應(yīng)性考試題庫帶答案詳解
- 2026年煙臺(tái)工程職業(yè)技術(shù)學(xué)院單招職業(yè)傾向性考試題庫附答案詳解
- 2026年黑龍江能源職業(yè)學(xué)院單招綜合素質(zhì)考試題庫及參考答案詳解一套
- 2026年贛南衛(wèi)生健康職業(yè)學(xué)院單招職業(yè)傾向性測試題庫附答案詳解
- 2026年漢中職業(yè)技術(shù)學(xué)院單招職業(yè)傾向性測試題庫及參考答案詳解一套
- 2026年石家莊工商職業(yè)學(xué)院單招職業(yè)傾向性考試題庫及完整答案詳解1套
- 2026年湖北省黃岡市單招職業(yè)適應(yīng)性測試題庫帶答案詳解
- 《中華民族共同體概論》考試復(fù)習(xí)題庫(含答案)
- 國家開放大學(xué)《公共政策概論》形考任務(wù)1-4答案
- 學(xué)堂在線 雨課堂 學(xué)堂云 西方哲學(xué)精神探源 期末考試答案
- 2025年楚雄州金江能源集團(tuán)有限公司招聘考試試題【答案】
- 道路應(yīng)急搶修方案
- 頂管穿越公路安全評估(二篇)
- 人體工程學(xué)-第五章-人體工程學(xué)與室外環(huán)境設(shè)施設(shè)計(jì)
- 2022浙DT9 民用建筑常用水泵和風(fēng)機(jī)控制電路圖
- T/CHEC 007-2021自動(dòng)平移門安裝驗(yàn)收技術(shù)規(guī)范
- 招標(biāo)代理公司制度與流程匯編
- 字節(jié)跳動(dòng)管理制度
評論
0/150
提交評論