統一編碼風格提升可讀性、降低維護成本。五大規範維度:
一、大小寫規範
- 大寫:關鍵字(
BEGIN, EXCEPTION, IF THEN ELSE, LOOP)、資料型別(VARCHAR2, NUMBER)、內建函數(LEAST, SUBSTR)、使用者子程序(Procedure/Function/Package名)
- 小寫:變數名、SQL欄位名、表名
二、空白與縮進
- 等號/比較運算子左右各留一空格
- 結構字(
DECLARE, BEGIN, EXCEPTION, END, IF, END IF, LOOP, END LOOP)靠左對齊
- 巢狀結構**縮進三個空格**(用Space鍵,非Tab)
- 主要程式區塊間空行分隔
- 同一結構不同邏輯分行(如
IF與THEN同行,ELSE/END IF獨立行)
三、命名慣例(前綴制)
| 前綴 | 對象 | 範例 |
v_ | 變數 | v_emp_count |
con_ | 常數 | con_max_salary |
i_ / o_ / io_ | 輸入/輸出/雙向參數 | i_dept_id |
c_ / _cur | 游標 | c_emp_cur |
rc_ | Ref Cursor | rc_dept |
r_ / _rec | Record | r_emp_rec |
type_ / _type | 使用者定義型別 | type_emp_rectype |
t_ / _tab | PL/SQL表 | t_emp_tab |
e_ | 自訂異常 | e_no_data_found |
Package名描述功能域(如student_admin),Procedure名描述動作(remove_student),Function名描述回傳值(student_enroll_count)。
四、註釋規範
- 解釋主要區塊與關鍵邏輯步驟
- **單行註釋(
--)優於多行(/* */)**:除錯時可部分取消註釋,多行註釋不可巢狀
五、其他建議
- 嵌入SQL遵循相同格式化指引
- 檔案頭註釋:用途、建立日期、作者、每版修訂記錄(作者/日期/描述)
- 使用等寬字體(Courier New)編輯,對齊無誤
完整範本範例
REM ********************************************************
REM * 檔名:coursediscount01.sql
REM * 版本:1
REM * 用途:對至少有一班超過10學生登記的課程給予折扣
REM * 參數:無
REM * 作者:s.tashi 時間:2000-01-01
REM * 修改者:y.sonam 時間:2000-02-01
REM * 描述:修正游標,增加縮進與註釋
REM ********************************************************
DECLARE
-- C_DISCOUNT_COURSE 找出至少有一班超過10學生登記的課程
CURSOR c_discount_course IS
SELECT DISTINCT course_no
FROM section sect
WHERE 10 <= (SELECT COUNT(*) FROM enrollment enr WHERE enr.section_id = sect.section_id);
-- 費用超過$2000課程的折扣率
con_discount_2000 CONSTANT NUMBER := .90;
-- 費用$1001-$2000課程的折扣率
con_discount_other CONSTANT NUMBER := .95;
v_current_course_cost course.cost%TYPE;
v_discount_all NUMBER;
e_update_is_problematic EXCEPTION;
BEGIN
-- 對於要打折的課程,確定當前費用與新費用
FOR r_discount_course IN c_discount_course LOOP
SELECT cost INTO v_current_course_cost
FROM course
WHERE course_no = r_discount_course.course_no;
IF v_current_course_cost > 2000 THEN
v_discount_all := con_discount_2000;
ELSE
IF v_current_course_cost > 1000 THEN
v_discount_all := con_discount_other;
ELSE
v_discount_all := 1;
END IF;
END IF;
BEGIN
UPDATE course
SET cost = cost * v_discount_all
WHERE course_no = r_discount_course.course_no;
EXCEPTION
WHEN OTHERS THEN
RAISE e_update_is_problematic;
END; -- 更新記錄子區塊結束
END LOOP; -- 主迴圈結束
COMMIT;
EXCEPTION
WHEN e_update_is_problematic THEN
-- 交易回滾
ROLLBACK;
DBMS_OUTPUT.PUT_LINE('There was a problem updating a course cost.');
WHEN OTHERS THEN
NULL;
END;
/
遵循規範非為束縛,而是為團隊協作與長期維護鋪路。
- 上一篇文章: Oracle表連接五大模式深度解析:等值、外部、非等值、自連接、Hash Join原理與Hint控制
- 下一篇文章: Oracle中文顯示亂碼根因分析與三類場景解決方案:字符集不匹配完全指南
Copyright ©
程式碼之家 All Rights Reserved