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