Oracle數據庫開發(fā)規(guī)范_第1頁
Oracle數據庫開發(fā)規(guī)范_第2頁
Oracle數據庫開發(fā)規(guī)范_第3頁
Oracle數據庫開發(fā)規(guī)范_第4頁
Oracle數據庫開發(fā)規(guī)范_第5頁
已閱讀5頁,還剩24頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 項目編號:×××xxxOracle數據庫開發(fā)規(guī)范Oracle DB Development Standardization<Language:Version><部門名稱>*年*月*日文檔信息:文檔名稱:文檔編號:文檔版本日期:起草人:起草日期:復審人:復審日期:版本歷史:版本日期作者更改參考說明審批信息:簽字/日期審核審批目錄1概述41.1編寫目的41.2文檔約定41.3預期的讀者和閱讀建議41.4參考文獻52數據庫對象命名62.1命名總體原則62.2表名62.3視圖62.4同義詞62.5序列72.6索引72.7存儲過程72.8

2、存儲函數82.9存儲程序包82.10觸發(fā)器82.11字段82.12其他93設計規(guī)范93.1范圍93.2表空間93.3字符集103.4主外鍵約束103.5分區(qū)表103.6RAC下的序列設計103.7字段103.8表結構設計113.9索引設計113.10臨時表114SQL編寫規(guī)范124.1書寫規(guī)范124.2SQL語句的索引使用134.3SQL語句降低系統(tǒng)負荷155PL/SQL編程規(guī)范185.1書寫規(guī)范185.2常用數據庫操作語句編碼規(guī)范195.3常用過程控制結構205.4Condition215.5Cursor225.6變量定義與賦值225.7過程與函數調用235.8例外處理 (Exception

3、)235.9例外處理的錯誤消息245.10注釋 (Comment)255.11應用調試控制275.12并發(fā)控制275.13代碼測試、維護291 概述1.1 編寫目的為規(guī)范軟件開發(fā)人員的Oracle數據庫開發(fā)提供參考依據和統(tǒng)一標準。1.2 文檔約定說明本文檔中所用到的專用術語定義或解釋,縮略詞定義。1.3 預期的讀者和閱讀建議本文檔適用于所有開發(fā)員。1.4 參考文獻 列出有關的參考文件,如: a屬于本項目的其他已發(fā)表文件; b本文件中各處引用的文檔資料。 列出這些文件的標題、作者,說明能夠得到這些文件資料的來源。2 數據庫對象命名2.1 命名總體原則本規(guī)范所涉及數據庫對象主要是指表、視圖、同義詞

4、、索引、序列、存儲過程、函數、觸發(fā)器等;命名應使用富有意義的英文詞匯,盡量避免使用縮寫,多個單詞組成的,中間以下劃線分割;避免使用Oracle的保留字或關鍵字,如LEVEL和TYPE;各表之間相關列名盡量同名;除數據庫模式對象名稱長度為18個字符,其余對象名稱均要求不超過30個字符;命名只能使用大寫英文字母,數字和下劃線,且以英文字母開頭。2.2 表名規(guī)則:XXX_MMM_DDDD說明:XXX代表子系統(tǒng)或模塊名稱(2-3個字母構成);MMM代表子模塊名稱(2-3個字母構成,根據實際情況可以沒有);DDDD為表的簡稱含義,使用英文單詞或詞組構成,可包括下劃線,但不得使用漢語拼音。示例:PO_HE

5、ADERS_ALL2.3 視圖規(guī)則:XXX_MMM_DDDD_V說明:XXX代表子系統(tǒng)或模塊名稱(2-3個字母構成);MMM代表子模塊名稱(2-3個字母構成,根據實際情況可以沒有);DDDD為視圖簡稱含義,使用英文單詞或詞組構成,可包括下劃線,但不得使用漢語拼音;V表示視圖,如有多個功能類似的視圖,名稱以V,V1,V2Vn區(qū)分。示例:PO_HEADER_RELEASE_V2.4 同義詞規(guī)則:與引用的原對象同名示例:PO_HEADERS_ALL2.5 序列規(guī)則:XXX_MMM_DDDD_S說明:XXX代表子系統(tǒng)或模塊名稱(2-3個字母構成);MMM代表子模塊名稱(2-3個字母構成,根據實際情況可

6、以沒有);DDDD為序列簡稱含義,使用英文單詞或詞組構成,可包括下劃線,但不得使用漢語拼音;S表示序列。示例:PO_HEADERS_S2.6 索引規(guī)則:XXX_MMM_DDDD_Tn說明:XXX代表子系統(tǒng)或模塊名稱(2-3個字母構成);MMM代表子模塊名稱(2-3個字母構成,根據實際情況可以沒有);DDDD為索引簡稱含義,要求同表名,如總長度超過限制,可適當縮寫;T有三種值:U表示唯一性索引,N表示非唯一性索引,B表示位圖索引;n表示序號,用數字構成。示例:PO_HEADERS_ALL_U12.7 存儲過程規(guī)則:XXX_MMM_DDDD_P說明:XXX代表子系統(tǒng)或模塊名稱(2-3個字母構成);

7、MMM代表子模塊名稱(2-3個字母構成,根據實際情況可以沒有);DDDD為存儲過程簡稱含義,使用英文單詞或詞組構成,可包括下劃線,不得使用漢語拼音;P表示存儲過程。示例:PO_HEADERS_P2.8 存儲函數規(guī)則:XXX_MMM_DDDD_F說明:XXX代表子系統(tǒng)或模塊名稱(2-3個字母構成);MMM代表子模塊名稱(2-3個字母構成,根據實際情況可以沒有);DDDD為存儲函數簡稱含義,使用英文單詞或詞組構成,可包括下劃線,不得使用漢語拼音;F表示存儲函數。示例:PO_HEADERS_F2.9 存儲程序包規(guī)則:XXX_MMM_DDDD_PKG說明:XXX代表子系統(tǒng)或模塊名稱(2-3個字母構成)

8、;MMM代表子模塊名稱(2-3個字母構成,根據實際情況可以沒有);DDDD為存儲程序包簡稱,使用英文單詞或詞組構成,可包括下劃線,不得使用漢語拼音;PKG表示存儲程序包。示例:PO_HEADERS_PKG2.10 觸發(fā)器規(guī)則:XXX_MMM_DDDD_Tn說明:XXX代表子系統(tǒng)或模塊名稱(2-3個字母構成);MMM代表子模塊名稱(2-3個字母構成,根據實際情況可以沒有);DDDD為觸發(fā)器簡稱含義,要求同表名,如總長度超過限制,可適當縮寫;T表示觸發(fā)器;n表示序號,用數字構成。示例:PO_HEADERS_T12.11 字段一般性字段:使用英文單詞、詞組或其有意義的縮寫表示,可包括下劃線,不得使用

9、漢語拼音,多個類似含義的字段,可在最后加數字序號;特殊字段:(1)代表主鍵的字段:表名或縮寫+“_ID”,如PO_HEADER_ID(2)代表外鍵的字段:要求與相關表對應字段相同(3)記錄跟蹤字段(代表記錄創(chuàng)建人、創(chuàng)建時間、最后修改人、最后修改時間):字段名類型NULL?說明CREATED_BYNUMBERNOT NULL這些字段僅用于跟蹤數據的變化,而不能用于其他用途。CREATION_DATEDATENOT NULLLAST_UPDATED_BYNUMBERNOT NULLLAST_UPDATE_DATEDATENOT NULL(4)擴展字段(預留未來使用): ATTRIBUTE+n,n代

10、表序號,如ATTRIBUTE1,類型統(tǒng)一為VARCHAR2(150);對應擴展屬性分類字段,命名為ATTRIBUTE_CATEGORY,類型為VARCHAR2(30)。2.12 其他其他對象參照上述原則和對象命名。3 設計規(guī)范3.1 范圍設計規(guī)范主要是對與開發(fā)關系密切的數據庫整體設計部分進行說明,以便于DBA更有效的管理和維護數據庫。主要包括表空間、字符集、主外鍵約束、分區(qū)表、字段類型等內容。3.2 表空間一致性:無論是基于商品化軟件的開發(fā),還是獨立的客制化開發(fā)系統(tǒng),對于客制化對象,每個子系統(tǒng)或模塊都使用統(tǒng)一的一組表空間(數據表空間和索引表空間各一個,且數據表空間為默認表空間);獨立性:數據和

11、索引獨立存儲,表空間由DBA統(tǒng)一管理和維護,任何新建表均應使用默認的數據表空間,新建索引均需使用指定的索引表空間;新建表和索引時,原則上不允許指定除表空間以外的任何參數,特殊情況必須指定有別于表空間的默認參數時,需經過單獨評審。示例:CREATE TABLE TABLE_NAME (FIELD1) TABLESPACE XXX;例外情況:當使用分區(qū)表時,可根據情況建立獨立的表空間。3.3 字符集應用系統(tǒng)數據庫應使用UTF8字符集,應用程序開發(fā)本身也需要支持UTF8字符集錄入和查詢。注意事項:UTF8字符集默認排序規(guī)則非中文拼音,如有需要應在代碼級或數據庫會話級做特殊處理。3.4 主外鍵約束數據

12、庫表對象原則上禁止使用主外鍵約束,主外鍵所承擔的主要作用應通過其他方式實現,如主子表數據完整性由應用層實現,索引功能通過建立單獨索引實現。3.5 分區(qū)表為了降低數據庫的維護復雜度,非必要情況下,不使用分區(qū)表;或經常需要跨分區(qū)查詢數據,此時也不應使用分區(qū)表;特殊應用場景確有必要時,可選擇范圍分區(qū)表、列表分區(qū)表、哈希分區(qū)表、組合分區(qū)表幾種方式,并根據分區(qū)類型和分區(qū)依據,調整索引,使相關數據查詢盡量在一個分區(qū)中完成。3.6 RAC下的序列設計當數據庫部署架構為RAC時,原則上禁止使用序列生成依賴其大小排序的單據號碼,如確有必要,則序列必須設計為禁用緩存模式。3.7 字段數值類型使用NUMBER,需要

13、存儲整型數值時,可指定小數位精度為0;枚舉類型優(yōu)先使用數值型替代字符型,且需要備注說明枚舉類型的各個不同取值的含義;ID結尾的字段為應為數值型,CODE結尾的字段可為字符型或數值型;用CHAR(1)表示布爾值的取大寫:“Y”,“N”,或改為數值型,用0和1表示;原則上使用VARCHAR2代替CHAR類型,以節(jié)省存儲空間,但對性能要求太別高的應用場景例外;日期時間型應使用DATE,禁止使用字符型;使用CLOB代替LONG,BLOB代替LONG RAW;一般性字段應有含義注釋,對于可以有缺省值的字段,應設為非空類型,并給出缺省值。3.8 表結構設計原則上表結構設計應符合第三范式,減少冗余字段,但在

14、不影響數據一致性的情況下,為了提高性能或開發(fā)實現的方便性,可以適當增加冗余字段。創(chuàng)建表時,應添加相關注釋,簡要說明主要用途。表與表之間的關系應提供E-R圖。3.9 索引設計對代表唯一記錄的字段或字段組合應建立唯一索引,對于查詢中需要作為查詢條件的字段,可以考慮建立非唯一索引,對于作為查詢條件的枚舉型字段,可考慮建立位圖索引。建立復合索引時,應根據條件字段的查詢頻率決定索引字段順序。開發(fā)過程中新編寫的SQL,應對照查詢條件檢查有無相關索引,除需要特別指定全表掃描的情況外,原則上應建立相關索引。3.10 臨時表臨時表指創(chuàng)建表時指定臨時表參數的數據表,并非指表名中含有TEMP字符的表。盡量避免在臨時

15、表上使用DISTINCT、ORDER BY、GROUP BY、HAVING、JOIN,以減輕臨時表負擔,同時應避免頻繁創(chuàng)建和刪除臨時表,減少系統(tǒng)表資源的消耗。在新建臨時表時,如果一次性插入數據量很大,應使用SELECT INTO代替CREATE TABLE,避免數據庫LOG,提高速度;如果數據量不大,為了緩和系統(tǒng)表的資源,可先CREATE TABLE,然后INSERT。如果臨時表的數據量較大,需要建立索引,那么應該將創(chuàng)建臨時表和建立索引的過程放在單獨一個子存儲過程中,以保證系統(tǒng)能夠很好的使用到該臨時表的索引。如果在程序中動態(tài)創(chuàng)建了臨時表,最后務必將其顯式刪除,并優(yōu)先TRUNCATE TABLE

16、,然后DROP TABLE,以避免系統(tǒng)表的較長時間鎖定。4 SQL編寫規(guī)范為了提高系統(tǒng)性能,避免未優(yōu)化的SQL語句降低系統(tǒng)性能,要求SQL語句寫法必須考慮以下兩個方面:a、使用恰當的索引b、減少系統(tǒng)負荷。同時為保障規(guī)范的落地執(zhí)行,SQL開發(fā)工具統(tǒng)一使用PL/SQL Developer,并使用統(tǒng)一的Beautifier設置和模板。4.1 書寫規(guī)范4.1.1 大小寫保留字統(tǒng)一使用大寫字符,其他字符除常量值外,一律使用小寫字符。4.1.2 對齊SELECT、UPDATE、DELETE、INSERT、FROM、WHERE等保留字原則上要獨立引領一行,保持左對齊并與其后字符保留空格;WHERE條件中“=

17、”兩邊各保留一個空格,條件Column保持對齊。示例:語句名格式SELECTSELECT column1 ,column2 ,column3FROM table_nameWHERE column1 = v_condition1AND column2 = v_condition2GROUP BY column_nameORDER BY column_name;4.1.3 別名當一個SQL 語句中涉及到多個表時,應始終使用別名來限定字段名,避免含義模糊的引用;別名命名時,避免使用無意義的代號a、b 、c , 而應該有意義(如表mtl_system_items_b 對應別名為msi,po_heade

18、rs_all 別名對應為pha)。4.2 SQL語句的索引使用除特殊情況外,原則上SQL語句應使用索引,且一般要遵守以下規(guī)則。4.2.1 避免索引列上的函數如果函數中使用到索引列字段,則索引是不被利用的,可以通過改變SQL寫法來回避。SUBSTR不使用SELECT e.ename FROM emp e WHERE SUBSTR(e.ename, 1, 1) = 'S'使用SELECT e.ename FROM emp e WHERE e.ename LIKE 'S%'以上假設emp表的ename建立了索引。TO_CHAR、TO_DATE不使用SELECT e.e

19、name FROM emp e WHERE TO_CHAR(e.hiredate,'YYYY/MM/DD') = '1981/11/17'使用SELECT e.ename FROM emp e WHERE e.hiredate = TO_DATE('1981/11/17','YYYY/MM/DD');以上假設emp表的hiredate建立了索引。NVL不使用SELECT e.ename FROM emp e WHERE nvl(m,0) < 1000;使用SELECT e.ename FROM emp e WHERE m I

20、S NULL OR m < 1000;以上假設emp表的comm建立了索引。TRUNC不使用SELECT e.ename FROM emp e WHERE TRUNC(e.hiredate) BETWEEN to_date('2005/01/01','YYYY/MM/DD') AND to_date('2005/01/31','YYYY/MM/DD');使用SELECT e.ename FROM emp e WHERE e.hiredate >= to_date('2005/01/01','YY

21、YY/MM/DD') AND e.hiredate < to_date('2005/01/31','YYYY/MM/DD')+1;以上假設emp表的hiredate建立了索引。4.2.2 避免索引列上的計算公式如果索引列上使用了計算公式,則索引不能使用,可以通過更改計算公式來避免。不使用SELECT e.ename FROM emp e WHERE e.sal*1.1 > 900;使用SELECT e.ename FROM emp e WHERE e.sal > 900/1.1;以上假設emp表的sal建立了索引。4.2.3 避免使用n

22、ot in,使用not exists代替使用not in時,可能導致從表索引無法使用,可以使用not exists來避免。不使用SELECT e.ename FROM emp e WHERE e.deptno NOT IN (SELECT d.deptno FROM dept d);使用SELECT e.ename FROM emp e WHERE e.deptno NOT EXISTS (SELECT 'x' FROM dept d WHERE d.deptno = e.deptno);4.2.4 LIKE的使用LIKE用于模糊檢索,LIKE檢索的樣式有三種:前匹配(XX%)

23、、中間匹配(X%X)、后匹配(%XX)。對于前匹配可以使用索引,而使用中間匹配和后匹配,都不能使用索引。因此除非必要,否則應盡量避免使用中間匹配和后匹配。不使用SELECT e.ename FROM emp e WHERE e.ename LIKE '%B'使用SELECT e.ename FROM emp e WHERE e.ename LIKE 'B%'4.2.5 復合索引的使用要使用復合索引,where語句中必須包括復合索引中的所有列或前幾個列。如果復合索引的第一個列不在where語句中則不能使用該復合索引。不使用SELECT e.ename FROM e

24、mp e WHERE e.job = 'MANAGER'使用SELECT e.ename FROM emp e WHERE e.deptno = 20 AND e.job = 'MANAGER'使用SELECT e.ename FROM emp e WHERE e.deptno = 20;以上假設emp表的deptno, job建立了索引。4.2.6 索引提示使用對于特別的應用場景可利用hint固化執(zhí)行計劃,以使用正確索引。4.3 SQL語句降低系統(tǒng)負荷4.3.1 編寫可再利用性的SQL語句對已經運行過的SQL語句,Oracle會將它放在SQL緩沖池中,當有SQ

25、L需要運行時,Oracle會先從SQL緩沖池中查詢是否該語句已經存在,如存在的話則直接執(zhí)行,否則需要進行編譯、解析的操作。因此編寫可再利用的SQL語句可以提高系統(tǒng)性能。為了提高SQL語句的可再利用,必須注意以下兩點:遵守SQL編寫規(guī)范:原則上,對于不是完全一樣的SQL,oracle不會去再利用。即使是大小寫不同,多了1個空格,都被認為是不同的SQL語句。所以,要徹底的遵循SQL/PLSQL編程規(guī)范,來保證SQL語句的再利用性。利用變量綁定:當需要動態(tài)組合條件時,應避免直接將變量值組合到條件中去,而應該使用變量綁定,從而提高SQL語句的再利用性。4.3.2 使用表別名通過對表附加別名,SQL編譯

26、時可以明確列的來源表,從而使得SQL的編譯時間縮短,另外還可以增加SQL語句的可讀性。4.3.3 ROWNUM的使用ROWNUM可以限制檢索數據的數量,如果為了判斷對象是否存在,使用ROWNUM=1是非常有效的。檢索是否存在部門20的員工SELECT 'Y' FROM emp e WHERE e.deptno = 20 AND ROWNUM = 1;注意:由于ROWNUM是獲得數據的順序號,在有ORDER BY子句的情況下,ROWNUM列無法按分類有序遞增。4.3.4 UNION和UNION ALL為了排除有UNION重復的data,系統(tǒng)自動進行分類處理。如果確定聯合中不會出現

27、重復數據的話,必須設定UNION ALL來取消自動分類以提高檢索速度。4.3.5 替代DISTINCT使用DISTINCT將引起內部排序處理,如有可能,應盡量使用EXISTS、NOT EXISTS或子查詢來避免。使用DISTINCTSELECT DISTINCT d.deptno, d.dname FROM dept d, emp e WHERE d.deptno = e.deptno;使用EXISTSSELECT d.deptno, d.dname FROM dept d WHERE EXISTS (SELECT 'x' FROM emp e WHERE d.deptno =

28、 e.deptno);4.3.6 避免視圖濫用如果查詢只檢索基表的幾個字段,應避免直接使用視圖,造成不必要的數據塊檢索。視圖CREATE VIEW CRM_emp_v SELECT e.empno, e.ename, e.sal, d.deptno, d.dname FROM emp e, dept d WHERE e.deptno=d.deptno;使用視圖SELECT e.empno, e.ename FROM CRM_emp_v;使用基表SELECT e.empno, e.ename FROM emp;4.3.7 組合查詢語句盡量將幾個簡單的SQL語句組合成一個SQL進行查詢,可以減少數

29、據檢索次數,提高檢索效率,但會造成可讀性較差。組合前SELECT e.sal FROM emp e WHERE e.ename = 'Jimmy'SELECT AVG(e.sal) FROM emp e WHERE e.deptno = 20;組合后SELECT e.sal, d.sal_avgFROM (SELECT e1.sal FROM emp e1 WHERE e1.ename = 'Jimmy') e (SELECT AVG(e2.sal) sal_avg FROM emp e2 WHERE e2.deptno = 20 ) d;4.3.8 WHERE

30、條件中不調用自定義函數或過程在WHERE條件中調用自定義函數或過程極易造成SQL性能嚴重降低,原則上應禁止使用,除非十分有必要且能百分百保證此條件不會成為查詢驅動條件。4.3.9 避免強制類型轉換SQL中的字符類型數據應該統(tǒng)一使用單引號,特別對純數字的字符串,必須用單引號,以免導致內部轉換而引起性能問題或索引失效。SQL中的變量、常量、表關聯字段等與對應條件字段應保持相同類型或使用顯式轉換,避免數據庫內部的強制轉換。5 PL/SQL編程規(guī)范5.1 書寫規(guī)范5.1.1 SQL書寫SQL書寫應符合SQL編寫規(guī)范。5.1.2 大小寫程序代碼中要求保留字統(tǒng)一使用大寫字符,其他字符除常量值外,一律使用小

31、寫字符;程序注釋中不做大小寫要求。5.1.3 變量和參數程序內部變量名稱要求以“v_”開頭;輸入參數名稱要求以“p_”開頭;輸出參數或變量名稱要求以“x_”開頭;游標變量要求以“cur_”開頭;游標記錄變量要求以“rec_”開頭;與表記錄或字段關聯的變量,變量類型統(tǒng)一使用%ROWTYPE或%TYPE,以便保持與相關表或字段一致。5.2 常用數據庫操作語句編碼規(guī)范語句名格式SELECTSELECT column1 ,column2 ,column3INTO variable1 ,variable2 ,varibale3FROM table_nameWHERE Condition1AND Cond

32、ition2GROUP BY column_nameORDER BY column_name;注:SELECT,INTO,WHERE等保留字左對齊并與其后參數保留空格。Column盡量與其對應Variable對齊。語句名格式UPDATEUPDATE table_nameSET column1 = value1 ,column2 = value2WHERE Condition;注:UPDATE,SET,WHERE等保留字左對齊并與其后參數保留空格。”=”兩邊各保留一個空格。Column保持對齊。語句名格式INSERTINSERT INTO table_name( column1 ,column2

33、 ,column3)VALUES ( value1 ,value2 ,value3);注:“(“緊跟table_name和VALUES,”)”獨立一行。Column盡量與其對應Variable對齊。語句名格式DELETEDELETE FROM table_nameWHERE Condition;注:DELETE,WHERE等保留字左對齊并與其后參數保留空格?!?”兩邊各保留一個空格。Condition保持對齊。5.3 常用過程控制結構結構名格式IF-ELSEIF Condition THEN ELSIF Condition THEN ELSIF Condition THEN ELSE END

34、IF;注:模塊中的縮進為4個空格,盡量不使用IF嵌套。結構名格式LOOPLOOP variable:= variable + 1; IF variable = 10 THEN EXIT; END IF;END LOOP;LOOP variable := variable + 1; EXIT WHEN variable = 10;END LOOP;注:模塊中的縮進為4個空格,"="兩邊保留1個空格。結構名格式FOR LOOPFOR variable1 IN 12 . 150 LOOP variable1 := variable1 + (variable2 * 10); EXI

35、T WHEN variable1 > 12900;END LOOP;結構名格式WHILE LOOPWHILE variable < value LOOP SELECT variable1, variable2, variable3 INTO value1, value2, value3 FROM table_name WHERE variable4 = value4;END LOOP;5.4 Condition規(guī)范內容格式所有復合條件必須使用括號來區(qū)分,且AND與OR右對齊AND ConditionAAND (ConditonB)OR (ConditionC)對于空值的判斷必須使用

36、IS NULL/ IS NOT NULLIF variable IS NULL THEN END IF;避免使用Hard Code,特別是常數,必須使用Hard Code的情況,要符合注釋規(guī)范要求錯誤:ORG_ID = 90 正確:ORG_ID = FND_PROFILE.VALUE(ORG_ID)5.5 Cursor規(guī)范內容格式Cursor必須顯式定義, 不能隱式定義隱式定義:OPEN cur_Meaning IS SELECT << cur_Meaning_Loop >>LOOP FETCH cur_Meaning INTO variable; EXIT WHEN

37、cur_Meaning%NOTFOUND;END LOOP cur_Meaning_Loop; 顯示定義:DECLARE CURSOR cur_Meaning IS SELECT ;BEGIN END;Cursor可以顯式使用, 也可以隱式使用顯式使用:DECLARE CURSOR cur_Meaning IS SELECT ;BEGIN OPEN cur_Meaning; LOOP FETCH cur_Meaning INTO ; EXIT WHEN cur_Meaning%NOTFOUND; END LOOP; CLOSE Cur_Meaning; END;隱式使用:DECLARE CUR

38、SOR Cur_Meaning IS SELECT ;BEGIN FOR variable_rec IN Cur_Meaning LOOP END LOOP; END;5.6 變量定義與賦值規(guī)范內容格式變量用":="賦值,":="兩邊保留1個空格;v_meaning := value不等號用"<>"表示,"<>"兩邊保留1個空格;v_variable1 <> variable2用于查詢數據庫的變量類型與數據庫中對應變量類型相同DECLARE v_meaning tablename

39、.column1%type;BEGIN SELECT column1 INTO v_meaning FROM tablename;END;5.7 過程與函數調用規(guī)范內容格式調用Procedure / Function的參數對齊CUX_EMPLOYEE_PRC( value1 ,value2 ,value3);建議調用Procedure / Function的參數時使用顯式調用并對齊XXX_EMPLOYEESAV_PRC( P_parameter1 => value1 ,P_parameter2 => value2 ,P_parameter3 => value3);5.8 例外

40、處理 (Exception)規(guī)范內容格式所有的SELECT INTO SQL都必須有Exception, 必須包括NO_DATA_FOUND, TOO_MANY_ROWS和OTHERS處理; 每一句SELECT語句必須有自己的Exception處理BEGIN SELECT INTO FROM WHERE condition;EXCEPTION WHEN no_data_found THEN WHEN too_many_rows THEN WHEN OTHERS THEN END;對Cursor的NO_DATA_FOUND例外,必須要有Exception Handle;在處理Exception時

41、,必須將所用到的Cursor關閉DECLARECURSOR Cur_Meaning IS SELECT ;BEGIN OPEN Cur_Meaning; FETCH Cur_Meaning INTO ;EXCEPTION WHEN NO_DATA_FOUND THEN IF Cur_Meaning %ISOPEN THEN CLOSE Cur_Meaning; END IF;END;5.9 例外處理的錯誤消息不允許在程序中寫死錯誤消息或提示信息,而應分系統(tǒng)統(tǒng)一定義消息和調用接口;每個消息應有唯一代碼,程序中僅需通過接口調用消息代碼;消息內容應支持變量替代(&代表變量定義),以便靈活顯示

42、消息內容。錯誤消息定義示例(未考慮多語言):消息名稱模塊簡稱消息內容XXX_NO_DATA_FOUNDXXXNo data found when find &FINDING ! Condition: &CONDITIONXXX_TOO_MANY_ROWSXXXMore than one record found when find &FINDING ! Condition: &CONDITIONXXX_OTHERS_ERRORXXXFetal Error when find &FINDING ! Error: &ERROR錯誤消息調用示例:規(guī)范內

43、容格式調用已定義的錯誤消息BEGIN SELECT unit_price INTO v_unit_price FROM oe_order_lines_all WHERE line_id = v_line_id;EXCEPTION WHEN NO_DATA_FOUND THEN xxx_message.set_name('XXX','XXX_NO_DATA_FOUND'); xxx_message.set_token('FINDING','unit_price'); xxx_message.set_token('CONDIT

44、ION','LINE_ID = '|to_char(v_line_id); xxx_message.error; -拋出錯誤消息 WHEN TOO_MANY_ROWS THEN xxx_message.set_name('XXX','XXX_TOO_MANY_ROWS'); xxx_message.set_token('FINDING','unit_price'); xxx_message.set_token('CONDITION','LINE_ID = ' |to_char

45、(v_line_id); xxx_message.error; -拋出錯誤消息 WHEN OTHERS THEN fnd_message.set_name('CUX','CUX_OTHERS_ERROR'); fnd_message.set_token('FINDING','unit_price'); fnd_message.set_token('ERROR',substr(SQLERRM, 1, 200); fnd_message.error;END;5.10 注釋 (Comment)規(guī)范內容格式程序頭部注釋/*

46、= Copyright (C) xxx Application AllRights Reserved =* =* PROGRAM NAME:* * DESCRIPTION: * * HISTORY: * 1.00 mm/dd/yyyy Author Name* Creation Description* 1.01 mm/dd/yyyy Author Name * Changes Description * =*/在每一個Procedure / Function的開始放置程序注釋, 只在Package Header中即可/* =* FUNCTION / PROCEDURE* NAME £

47、;º* DESCRIPTION: * * ARGUMENT: p_sequences_id IN - 序列標識 * * RETURN: x_price OUT 價格* HISTORY: * 1.00 mm/dd/yyyy Author Name* Creation Description* 1.01 mm/dd/yyyy Author Name * Changes Description * =*/在每一個變量聲明的旁邊添加注釋DECLAREv_UOM_code table.column%TYPE; - 物料單位v_flag varchar2(1); - Y/N 用于控制是否繼續(xù)IF語句必須加注釋,給出注釋來說明不同條件下不同的處理邏輯IF conditionA THEN ELSIF conditionB THEN - IF conditionA THEN EL

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論