1. 引言
1.1 目的
自定義報(bào)表制作是售后服務(wù)工作的重要部分,目前在報(bào)表編寫中存在代碼書寫不規(guī)范、性能問題突出,主要表現(xiàn)在:
數(shù)據(jù)源名稱定義不標(biāo)準(zhǔn)
SQL語句書寫不規(guī)范
格式混亂
造成他人不能直觀的理解數(shù)據(jù)源的作用,給報(bào)表的日常維護(hù)和調(diào)整帶來了困難,也不便于管理和價(jià)值分析。為了規(guī)范數(shù)據(jù)源的書寫,保證報(bào)表的SQL性能特編寫規(guī)范。
良好的書寫習(xí)慣和統(tǒng)一編碼規(guī)范是提高代碼可靠性與可讀性非常重要的手段,我們希望通過遵循本規(guī)范來避免不好的書寫風(fēng)格,增強(qiáng)代碼的易讀性,可靠性和可維護(hù)性,便于自己和其它人員理解和后期維護(hù)。
1.2 術(shù)語解釋
參數(shù): 確定報(bào)表?xiàng)l件值的范圍和類型,并將用戶輸入的數(shù)值傳回?cái)?shù)據(jù)源,構(gòu)造成完整的SQL語句。
驅(qū)動(dòng)表:驅(qū)動(dòng)表(Driving Table)又稱為外層表(OUTER TABLE)。這個(gè)概念用于嵌套與HASH連接中。如果該row source返回較多的行數(shù)據(jù),則對(duì)所有的后續(xù)操作有負(fù)面影響。注意此處雖然翻譯為驅(qū)動(dòng)表,但實(shí)際上翻譯為驅(qū)動(dòng)行源(driving row source)更為確切。一般說來,是應(yīng)用查詢的限制條件后,返回較少行源的表作為驅(qū)動(dòng)表,所以如果一個(gè)大表在WHERE條件有有限制條件(如等值限制),則該大表作為驅(qū)動(dòng)表也是合適的,所以并不是只有較小的表可以作為驅(qū)動(dòng)表,正確說法應(yīng)該為應(yīng)用查詢的限制條件后,返回較少行源的表作為驅(qū)動(dòng)表。
2. 規(guī)范內(nèi)容
2.1 數(shù)據(jù)源頭注釋
一個(gè)易于閱讀、理解的數(shù)據(jù)源頭注釋必須包括以下內(nèi)容:
作者
編寫日期
所屬的產(chǎn)品類別(HIS,病案,物資等)
程序版本號(hào)
作用
特殊說明
修改者
修改日期
修改原因
示例:
/*------------------------------------------------------------------------------------------------------------
作者:
編寫日期: 06年06月06日
產(chǎn)品類別:HIS
程序版本:10.13
作用:統(tǒng)計(jì)一個(gè)月門診醫(yī)生開單總量與金額
說明:
修改情況:1.修改者: 修改日期: 11年X月XX日
2.修改者:XXX 修改日期:XX年XX月XX日
修改原因:
------------------------------------------------------------------------------------------------------------*/
2.2 語句注釋
語句注釋主要用于對(duì)SQL語句中關(guān)鍵的算法或函數(shù)使用進(jìn)行說明,便于閱讀者能夠快速理解語句。
注釋單獨(dú)成行、放在語句前面
應(yīng)對(duì)不易理解的分支條件表達(dá)式加注釋
重要的函數(shù)應(yīng)說明其功能
過長的函數(shù)實(shí)現(xiàn),應(yīng)將其語句按實(shí)現(xiàn)的功能分段加以概括性說明
常量及變量注釋時(shí),應(yīng)注釋被保存值的含義(必須),合法取值的范圍(可選)
只能采用多行注釋 (‘/* ‘,’*/ ‘)方式,因?yàn)樵趫?bào)表工具中對(duì)單行注釋有時(shí)會(huì)處理錯(cuò)誤。
示例:
/*統(tǒng)計(jì)一個(gè)時(shí)間段門診各部門的開單情況*/
SELECT No, 姓名 || '_' || 病人id AS "病人 信息", b.名稱 AS 開單部門, 收據(jù)費(fèi)目,
NVL (付數(shù),1) * NVL (數(shù)次,1) * NVL (標(biāo)準(zhǔn)單價(jià),1) AS 單據(jù)金額
FROM 病人費(fèi)用記錄 a, 部門表 b
WHERE a.病人科室id = b.Id(+)
AND a.記錄性質(zhì) = 1
AND a.No = 'G000001'
AND a.記錄狀態(tài) IN (0, 1)
2.3 列別名定義
為了方便快速的調(diào)用和閱讀,我們需要定義別名:
別名定義要突出主題
別名與列名之間用”AS”聯(lián)接
如果包含空格、特殊字符或區(qū)分大小寫,則使用雙引號(hào)
示例:
SELECT No, 姓名 || '_' || 病人id AS "病人 信息", b.名稱 AS 病人科室, 收據(jù)費(fèi)目,
NVL (付數(shù),1) * NVL (數(shù)次,1) * NVL (標(biāo)準(zhǔn)單價(jià),1) AS 單據(jù)金額
FROM 病人費(fèi)用記錄 a, 部門表 b
WHERE a.病人科室id = b.Id(+)
AND a.記錄性質(zhì) = 1
AND a.No = 'G000001'
AND a.記錄狀態(tài) IN (0, 1)
2.4 關(guān)鍵字定義
SQL語句中的系統(tǒng)保留字、內(nèi)置函數(shù)名、SQL保留字都可稱之為關(guān)鍵字。可以將關(guān)鍵字首字母大寫,或所有關(guān)鍵字大寫,但在同一數(shù)據(jù)源中必須相同,關(guān)鍵字書寫風(fēng)格必須相同,不能混用。
如下這段代碼就是不規(guī)范的代碼:
Select No, 姓名 || '_' || 病人id AS "病人 信息", b.名稱 AS 病人科室, 收據(jù)費(fèi)目,
NVL (付數(shù),1) * NVL (數(shù)次,1) * NVL (標(biāo)準(zhǔn)單價(jià),1) AS 單據(jù)金額
from 病人費(fèi)用記錄 a, 部門表 b
WHERE a.病人科室id = b.Id(+)
aND a.記錄性質(zhì) = 1
anD a.No = 'G000001'
AND a.記錄狀態(tài) IN (0, 1)
2.5 函數(shù)的使用及格式
不正確的使用函數(shù)會(huì)造成SQL語句執(zhí)行效率的低下和不易閱讀,所以大家在使用函數(shù)一定要注意正確的方法。
下面列舉幾個(gè)例子說明: SELECT No, 姓名 || '_' || 病人id AS "病人 信息", b.名稱 AS 病人科室, 收據(jù)費(fèi)目,
NVL (付數(shù),1) * NVL (數(shù)次,1) * NVL (標(biāo)準(zhǔn)單價(jià),1) AS 單據(jù)金額
FROM 病人費(fèi)用記錄 a, 部門表 b
WHERE a.病人科室id = b.Id(+)
AND a.記錄性質(zhì) = 1
AND a.No = 'G000001'
AND a.記錄狀態(tài) IN (0, 1)
示例1:to_date與to_char的函數(shù)的轉(zhuǎn)換
我們知道在表達(dá)式的左邊進(jìn)行了任何計(jì)算都不能用到索引,會(huì)影響SQL的性能。在實(shí)際應(yīng)用中,我們發(fā)現(xiàn)一些使用函數(shù)的SQL語句是可以轉(zhuǎn)換的。
下面這段SQL使用了to_char函數(shù)判斷時(shí)間,將不能使用索引
|
|