影響
症狀
在復雜的企業應用中
為什麼是最差
太長的PL/SQL代碼不利於閱讀
解決之道
PL/SQL代碼在執行前會被加載到shared pool中
影響
症狀
CREATE OR REPLACE PACKAGE BODY PKG_TEST IS
GN_全局變量 NUMBER(
PROCEDURE 過程A IS
BEGIN
GN_全局變量:=
END;
PROCEDURE 過程B IS
BEGIN
GN_全局變量:=
END;
為什麼是最差
全局變量可以在整個包范圍內被訪問到
解決之道
減少或取締全局變量的使用
影響
症狀
在PL/SQL代碼中嵌入SQL語句
PROCEDURE 過程A IS
BEGIN
UPDATE T_A SET COL
END;
PROCEDURE 過程B IS
BEGIN
DELETE FROM T_A WHERE COL
END;
為什麼是最差
? PL/SQL代碼中嵌入SQL語句使得代碼含義變得難於閱讀和理解
? 在多個位置對表進行訪問
解決之道
? 將分散SQL語句進行封裝
? 對SQL的優化集中在封裝的過程中
影響
症狀
PROCEDURE 過程A(錯誤代碼 out varchar
BEGIN
UPDATE T_A SET COL
SELECT
DELETE FROM T_A WHERE COL
EXCEPTION
WHEN OTHERS THEN
END;
為什麼是最差
整個過程只有一個WHEN OTHERS 的異常段
解決之道
? 不使用WHEN OTHERS捕捉所有異常
? 聲明自己的異常處理機制
? 自定義完整的異常信息
影響
症狀
為什麼是最差
? 這種硬編碼的變量大小很可能與數據庫中實際大小不符
? 如果字段的類型
解決之道
使用%Type聲明與字段類型相關的變量
影響
症狀
為什麼是最差
解決之道
PL/SQL並沒有提供諸如JUnit之類易用的單元測試工具
影響
症狀
方法
V_sex:=
方法
CONST_MALE CONSTANT VARCHAR
V_sex:=CONST_MALE;
為什麼是最差
? 從例子中可以看出
? 當其他項目男性性別定義修改為
解決之道
將常量定義放入到公共的代碼包中
影響
症狀
為什麼是最差
因為Oracle內部結構的差異
? 對象職責劃分不清
? Oracle對象不能追溯既往
解決之道
? 規范開發過程
? 使用第三方插件減少同步工作量
影響
症狀
為什麼是最差
大量存在IF/ELSE
解決之道
? 使用Oracle數據庫的繼承特性
? 將頻繁使用的IF/ELSE代碼重構為單獨的過程或函數
影響
症狀
在PL/SQL非自治事務代碼中控制事務
PROCEDURE 過程A(錯誤代碼 out varchar
BEGIN
SAVEPOINT A;
UPDATE T_A SET COL
COMMIT;
DELETE FROM T_A WHERE COL
ROLLBACK TO A;
EXCEPTION
WHEN OTHERS THEN
END;
為什麼是最差
這種行為是我認為最差實踐中危害最大的一種
解決之道
? 由調用者決定何時提交或回滾事務
? 對於需要特殊事務管理的過程如記載日志
影響
症狀
為什麼是最差
這是一個常見問題
解決之道
影響
症狀
為什麼是最差
之所以將這個實踐評成最差
解決之道
影響
症狀
為什麼是最差
動態SQL失去了編譯期檢查能力
解決之道
影響
症狀
為什麼是最差
ROWID屬於Oracle底層存儲結構
解決之道
From:http://tw.wingwit.com/Article/program/Oracle/201311/17942.html