基本框架_應用指南_第1頁
基本框架_應用指南_第2頁
基本框架_應用指南_第3頁
基本框架_應用指南_第4頁
基本框架_應用指南_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、DO070 HAND_PLSQL_框架_應用指南作者:創(chuàng)建日期:最近更新:控制號:版本:Hand11-Jul-2111-Jul-211審批:全富漢得拷貝號 文檔控制變更審閱分發(fā)拷貝號地點1111職位日期作者版本變更參考07-Oct-051No previous09-Mar-072從Form&PLSQL 中分離PLSQL 出來目錄文檔控制ii概述4業(yè)務表模板4并發(fā)程序模板11代碼調試13概述本文檔詳細描述了在 客戶化項目開發(fā)中SQL/PLSQL 的一些規(guī)范和開發(fā)指南,用于指導開發(fā)員遵守開發(fā)標準、使用開發(fā)模板、快速進入開發(fā)角色。本文內容包括:1、 對業(yè)務表API 模板2、 并發(fā)程序的模板3、 如何

2、調試代碼使用框架和不使用框架相比,在剛開始使用的時候,會覺得更麻煩。但是就不麻煩了。了也問題是:為什么要使用框架? 要深刻的理解這個問題,先看兩個故事。這個故事在當前目錄的Story 目錄下??赐赀@兩個故事,可以理解了,如果Oracle 的代碼沒有Debug 功能。如何去分析解決問題? 那將是不可設想的。公司的客戶越來越多,客戶化開發(fā)也越來越多。隨之而來的是可能產生的問題也越來越多。的 Hotline 所接到的問題中,有很大一部分是客戶化開發(fā)的問題。而解決這些問題的人,一般都不是當初開發(fā)的人。而是在hotline 工作的人??上攵?,的代碼沒有Debug 功能,沒有Debug 的。以后出了問題

3、,讓他們怎么查?基于以上原因,建議的代碼都要使用的開發(fā)框架,因為這個框架是一個具備Debug 功能的框架。和Oracle 的Debug 框架是一致的。寫出來的代碼風格跟Oracle 是一致的。三個 Package 介紹1、 HAND_DEBUG.pck2、 HAND_API.pck3、 HAND_CONC_UTL.pck這三個package 都不大,熟讀以后有助于使用其中的Api.業(yè)務表模板對于業(yè)務表,必須提供公開函數(shù)來所示:,外部程序直接操作表,一般規(guī)則如下圖Database Table1、Table API 實現(xiàn)表基本操作:Insert、Lock、Update、Delete。2、Priva

4、te API 調用Table API 來操作表,該層實現(xiàn)驗證表的字段,同時通過調用其它API 提供的Public API 來實現(xiàn)表的業(yè)務邏輯。3、Public API 是公開的API,供外部程序調用,該層只做對傳入參數(shù)作簡單驗證;然后調用 Private API。4、對于所有的驗證,提供對立的Valiate API5、對于簡單的業(yè)務表,如基礎數(shù)據,該數(shù)據只在Form 中API。,可以只建立Table6、各程序包名規(guī)則:Table API:表名 + _PKG (table api)Private API:表名 + _PVT (private api)Public API:表名 + _PUB(pu

5、blic api)Valiate API:表名+ _UTL (validate api)對于多個API 間相用圖例:Database Table1Database Table2Table API 2Table API 1Private API 2Private API 1Public API 2Public API 1Table APIValidate APIPrivate APIPublic API以下介紹各API 的模板和使用方法Table API該程序包一般包括以下幾個過程:insert_row、lock_row、update_row、delete_row包頭定義:包體如下:PROCED

6、URE insert_row(x_row_id in out varchar2, x_primary_key in out number, p_field1 in )ISCURSOR CIECT ROWID FROM WHERE = p_primary_key; BEGININSERTO (field1, field2, ) VALUES (p_field1, p_field2, );OPEN c;FETCH cO x_row_id; IF (c%NOTFOUND) THEN CLOSE c;RAISE NO_DATA_FOUND; END IF;CLOSE c;END insert_row;

7、PROCEDURE lock_row(p_primary_key in number,PROCEDURE insert_row(x_row_id in out varchar2, x_primary_key in out number, p_field1 in ); PROCEDURE lock_row(p_primary_key in number, p_field1 in ); PROCEDURE update_row(p_primary_key in number, p_field1 in ); PROCEDURE delete_row(p_primary_key in number);

8、對于表中含有object_ver_number,其過程 lock_row 可簡化為PROCEDURE lock_row(p_primary_key in number, p_object_ver_number in number );p_field1 in )ISCURSOR c1IECT field1,field2, from where = p_primary_key FOR UPDATE OF NOWAIT;tlinfo c1%ROWTYPE; BEGINOPEN c1;FETCH c1O tlinfo;IF (c1%NOTFOUND) THEN CLOSE c1;fnd_message

9、.set_name(FND, FORM_RECORD_DELETED); app_exception.raise_exception;END IF; CLOSE c1;IF (tlinfo.field1 = p_field1 or (tlinfo.field1 is null and p_field1 is null) AND (tlinfo.field2 = p_field2 or (tlinfo.field2 is null and p_field2 is null)THENNULL; ELSEfnd_message.set_name(FND, FORM_RECORD_CHANGED);

10、app_exception.raise_exception;END IF;END lock_row;PROCEDURE update_row(p_primary_key in number, p_field1 in )IS BEGINUPDATE SETfield1= p_field1,field1= p_field1,WHERE = p_primary_key;IF (SQL%NOTFOUND) THEN RAISE NO_DATA_FOUND; END IF;END update_row;PROCEDURE delete_row(p_primary_key in number)IS BEG

11、INDELETE FROM WHERE = p_primary_key;IF (SQL%NOTFOUND) THEN RAISE NO_DATA_FOUND; END IF;END delete_row;對于表中含有object_ver_number,其過程 lock_row 可簡化為PROCEDURE lock_row(Private API / Public API 的過程模板為風格、簡化程序、提供的例外處理和調試功能,該程序包中的API 使用以下模板1、 為調試輸出信息2、 調用其他API。PROCEDURE create_temp( p_api_verIN NUMBER,p_init_

12、msg_listIN VARCHAR2 DEFAULT fnd_api.g_false, mitIN VARCHAR2 DEFAULT fnd_api.g_false,x_return_susOUT NOCOPY VARCHAR2,x_msg_countOUT NOCOPY NUMBER,x_msg_dataOUT NOCOPY VARCHAR2p_field1IN NUMB API 開始:x_temp_idOUT NOCO 1、 log:api enteringISl_api_nameCONSTANT VARCHAR 2、 創(chuàng)建保存點l_api_verCONSTANT NUMBER:=3、

13、檢查 api 版本4、 初始化消息列表BEGIN- start activity to create sa- and initialize message lis , includeo enter apix_return_sp_pkg_name p_api_name= l_p_api_type= g_api_type, p_init_msg_list =l_api_verp_api_ver= p_api_ver);- check if activity started sucsfullyIF (x_return_sus = fnd_api.g_ret_sts_unexp_error) THEN

14、 RAISE fnd_api.g_exc_unexpected_error;ELSIF (x_return_sus = fnd_api.g_ret_sts_error) TH 用戶代碼區(qū):p_primary_key in number, p_object_ver_number in number )CURSOR c1IECT object_ver_number from where = p_primary_key FOR UPDATE OF NOWAIT;tlinfo c1%ROWTYPE; BEGINOPEN c1;FETCH c1O tlinfo;IF (c1%NOTFOUND) THEN

15、 CLOSE c1;fnd_message.set_name(FND, FORM_RECORD_DELETED); app_exception.raise_exception;END IF; CLOSE c1;IF (tlinfo.object_ver_number = p_object_ver_number) THENNULL; ELSEfnd_message.set_name(FND, FORM_RECORD_CHANGED); app_exception.raise_exception;END IF;END lock_row;RAISE fnd_api.g_exc_error;END I

16、F;- API body- logging parameters/*IF l debug = Y THEN XH_debug.log(p_: END IF;*/| p_,2);- Prev crea- Insert the row/* BEGIN- set primary key fromler.sequenceselect temp_s.nextvalHand plsql template pkg.insp temp field1 p field2p_object_ver_number p_creation_datep created byp last udpate date p last

17、updated by=,);p_last_udpate_loginEXCEPTIONWHEN NO DATA FOUND THENx return sus := fnd api.g ret sts unexp error; HAND API.set message( p app name = CUX,p_msg_name = XH_TABLE_HANDLER_ERROR RAISE fnd api.g exc unexpected error;);END;*/-t creaogic (call othublic api)- API end body- end activity, include

18、 debug message hto exit apiHAND_API.end_activity( p_pkg_namep_api_namemit x_msg_count x_msg_dataEXCEPTION= g_pkg_name,= l_api_name,=mit,= x_msg_count,=x_msg_data );WHEN fnd_api.g_exc_error THENx_return_sus := HAND_API.handle_exceptions(p_pkg_name p_api_name p_api_type p_exc_name x_msg_count x_msg_da

19、taWHEN fnd_api.g_exc_unexpected_error THENx_return_sus := HAND_API.handle_exceptions(p_pkg_name p_api_name p_api_type p_exc_name x_msg_count x_msg_dataWHEN OTHERS THENx_return_sus := HAND_API.handle_exceptions(p_pkg_name p_api_name p_api_type p_exc_name x_msg_count x_msg_dataEND create_temp;=g_pkg_n

20、ame, l_api_name, g_api_type,HAND_API.g_exc_name_error, x_msg_count,x_msg_data);=g_pkg_name, l_api_name, g_api_type,HAND_API.g_exc_name_unexp, x_msg_count,x_msg_data);=g_pkg_name, l_api_name, g_api_type,HAND_API.g_exc_name_others, x_msg_count,x_msg_data);1、過程必要的參數(shù)其中:MIT:對于無數(shù)據更新操作可以不要,對于這類的 API,需要將 g_

21、api_type 設置為NULL,且調用 HAND_API.end_activity 不要傳遞mit 參數(shù)。驗證 API所有的驗證API 只返回驗證的結果狀態(tài),驗證的錯誤信息直接加入消息隊列。當驗證不通過時,使用HAND_API.set_message 將驗證錯誤信息加入到消息隊列。驗證API 可以不處理例外,而由調用者處理。以下提供兩種處理方式,一個不帶例外處理,一個帶例外處理。不帶例外處理:帶例外處理:PROCEDURE validate_currency_code1( p_currency_codeIN VARCHAR2,x_return_susOUT NOCOPY VARCHAR2)P

22、ROCEDURE validate_currency_code( p_currency_codeIN VARCHAR2,x_return_susOUT NOCOPY VARCHAR2)ISCURSOR c_currencies IECT 1FROM fnd_currenciesWHERE currency_code = p_currency_code;l_dummyVARCHAR2(1); BEGINx_return_sus := fnd_api.g_ret_sts_sucs;OPEN c_currencies;FETCH c_currenciesO l_dummy;IF c_currenci

23、es%NOTFOUND THEN x_return_sus := fnd_api.g_ret_sts_error;HAND_API.set_message( p_app_name= CUX,p_msg_name= XH_INVALID_CURRENCY_CODE, p_token1= P_CURRENCY_CODE, p_token1_value = p_currency_code);END IF;CLOSE c_currencies;END validate_currency_code;參數(shù)名類型數(shù)據類型描述P_API_VERINNUMBERAPI 版本號,用于檢查API 版本P_INIT_

24、MSG_LISTINVARCHAR2是否初始化消息隊列MITINVARCHAR2是否自動提交更改X_RETURN_SUSOUTVARCHAR2返回API 執(zhí)行狀態(tài)S成功E 錯誤U 例外X_MSG_COUNTOUTVARCHAR2返回錯誤消息的個數(shù)X_MSG_DATAOUTVARCHAR2返回第一個錯誤信息的內容并發(fā)程序模板并發(fā)程序的過程第 1,2 個參數(shù)是固定的:CREATE OR REPLACE PACKAGE BODY XH_CONC_TEMPLATE_PUB AS/*=Copyright (C) Xieheng Co.,. s=參數(shù)名類型數(shù)據類型描述ERRBUFOUTVARCHAR2并發(fā)

25、程序返回錯誤信息RETCODEOUTVARCHAR2并發(fā)程序返回狀態(tài)成功警告錯誤ISCURSOR c_currencies IECT 1FROM fnd_currenciesWHERE currency_code = p_currency_code;l_api_nameCONSTANT VARCHAR2(30) := VALIDATE_CURRENCY_CODE1;l_dummyVARCHAR2(1); BEGINx_return_s us := fnd_api.g_ret_sts_suc s;OPEN c_currencies;FETCH c_currencies O l_dummy; IF

26、 c_currencies%NOTFOUND THEN CLOSE c_currencies;HAND_API.set_message( p_app_name = CUX,p_msg_name= XH_INVALID_CURRENCY_CODE, p_token1= P_CURRENCY_CODE, p_token1_value = p_currency_code);RAISE fnd_api.g_exc_error;例外處理:END IF;1、 自動回滾事務CLOSE c_currencies;2、 獲取錯誤信息EXCEPTION3、 錯誤信息寫入日志WHEN fnd_api.g_exc_e

27、rror Tx_return_sus := fnd_api.g_ret_sts_error;WHEN fnd_api.g_exc_unexp_error THEN x_return_sus := fnd_api.g_ret_sts_unexp_error;WHEN OTHERS THENIF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_unexp_error) THENfnd_msg_pub.add_exc_msg( g_pkg_name, l_api_name ); END IF;x_return_sus := fnd_api.g_re

28、t_sts_unexp_error; END validate_currency_code1;* =*PROGRAM NAME:DESCRIPTION:HISTORY:1.00 2005-09-26Creation* =*/G_PKG_NAMECONSTANT VARCHAR2(30):= XH_CONC_TEMPLATE_PUB;PROCEDURE main( errbufOUT VARCHAR2,retcodeOUT VARCHAR2,p_parameter1 p_parameter2IN VARCHAR2, IN VARCHAR2)ISl_return_sus l_msg_count l

29、_msg_dataVARCHAR2(30); NUMBER; VARCHAR2(2000);并發(fā)程序開始1、 將傳入參數(shù)寫入日志BEGINretcode := 0;- concurrent header log Hand_conc_utl.log_header;2、程序開始時間- convert parameter daype, such as varchar2 to date- l_date := fnd_conc_date.string_to_date(p_parameter1);用戶代碼區(qū)1、 Pros_request API 使- conc body- call pro用 PUB AP

30、I 的模板s api2、 用戶的代碼在pros_request(pros_request 實現(xiàn)p_init_msg_list= fnd_api.g_true,mit= fnd_api.g_false,x_return_sus = l_return_sus,x_msg_count x_msg_data p_p_= l_msg_count,= l_msg_data,= p_parameter1= p_parameter2);IF l_return_sus = fnd_api.g_ret_sts_error THEN RAISE fnd_api.g_exc_error;ELSIF l_return_su

溫馨提示

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

評論

0/150

提交評論