1. 使用%type
sql
在許多狀況下,pl/sql中變量用來存儲在數據庫表中的數據,這時候,咱們就要求變量應該與數據庫表中的字段擁有相同的數據類型,例如:t_user表中的user_name字段類型爲varchar2(20),這時候咱們能夠申明一個變量:數據庫
declare v_userNme varchar2(20);
可是,若是有一天咱們表中字段的類型發生了改變,例如將t_user表中的user_name改成varchar2(25),那麼就會致使全部用到該字段的存儲過程的pl/sql代碼都必須進行修改,這是一項費時耗力的事情。code
如今,咱們可使用 %type 屬性來動態定義變量的類型,以下:it
declare v_userName t_user.user_name%type;
經過使用 %type ,user_name變量的類型與t_user表中user_name的字段類型動態的綁定了。io
2. 使用%rowtypefunction
假設咱們須要定義以下幾個變量,class
declare v_userName t_user.user_name%type; v_userGender t_user.gender%type; v_userAge t_user.age%type;
仔細查看下他們之間的關係,咱們就會發現他們同屬於一張表中的不一樣字段,若是爲這些變量聲明一個記錄類型,那麼就能夠將他們做爲一個單元來進行處理。登錄
declare v_userTable t_user%rowtype;
這裏變量
v_userName 就能夠用v_userTable.user_name來代替了。select
具體例子
create or replace procedure sp_checkAccount(i_account in t_account.acc_id%type, --登陸帳號 o_errNumber out integer) --錯誤代碼 is --帳號表數據 l_rtyAccount t_account%rowtype; --區域表數據 l_zoneData t_zone%rowtype; --經銷商數據 l_fchsData t_franchiser%rowtype; --門店數據 l_storeData t_store%rowtype; --銷售員數據 l_selrData t_seller%rowtype; --異常 l_exception exception; --錯誤消息 l_error_msg varchar2(100); /********** *creater: lxl *craeateTime: 2015-07-09 *function: checkAccount **********/ /********* o_errorNumber 0:帳號可用 1:異常 11:帳號不存在 12:帳號無效 13:區域狀態無效 14:經銷商狀態無效 15:門店狀態無效 *********/ /********* l_error_msg 0:帳號可用時返回空 11:帳號不存在 12:登陸帳號無效 13:區域狀態不可用 14:經銷商狀態不可用 15:門店狀態不可用 *********/ begin --初始化 o_errNumber := PKG_CONSTANTS.C_RTN_SUCCESS; l_error_msg := ''; --判斷帳號是否存在且啓用 begin select * into l_rtyAccount from t_account where acc_id = trim(i_Account); exception when no_data_found then --帳號不存在 o_errNumber := 11; l_error_msg := '帳號不存在'; raise l_exception; end; --判斷帳號是否已啓用 if l_rtyAccount.Status != PKG_CONSTANTS.C_STATUS1_ENABLE then o_errNumber := 12; l_error_msg := '帳號無效'; raise l_exception; end if; --備註:若是是總部登陸進來,上述檢查就能夠知足要求 --下面只須要檢查角色爲經銷商、門店和銷售員 --經銷商 if l_rtyAccount.Role_Type = PKG_CONSTANTS.C_ROLETYPE_FCHS then begin --1.根據角色代碼去經銷商表取數據 select * into l_fchsData from t_franchiser tf where tf.fchs_id = trim(l_rtyAccount.Role_Id); --2.判斷經銷商狀態是否可用 if l_fchsData.Status != PKG_CONSTANTS.C_STATUS1_ENABLE then o_errNumber := 12; l_error_msg := '經銷商狀態不可用'; raise l_exception; else --查詢區域全部數據 begin select * into l_zoneData from t_zone tz where tz.zone_id = l_fchsData.Zone_Id; --判斷區域狀態是否可用 if l_zoneData.Status != PKG_CONSTANTS.C_STATUS1_ENABLE then o_errNumber := 13; l_error_msg := '區域狀態不可用'; raise l_exception; else o_errNumber := 0; l_error_msg := ''; end if; exception when no_data_found then o_errNumber := PKG_CONSTANTS.C_RTN_FAILURE; l_error_msg := '經銷商查詢區域數據出錯'; end; end if; exception when no_data_found then o_errNumber := PKG_CONSTANTS.C_RTN_FAILURE; l_error_msg := '經銷商查詢經銷商數據出錯'; end; --門店 elsif l_rtyAccount.Role_Type = PKG_CONSTANTS.C_ROLETYPE_STORE then begin --1.根據角色代碼去門店表取數據 select * into l_storeData from t_store ts where ts.store_id = l_rtyAccount.Role_Id; --2.判斷門店狀態是否可用 if l_storeData.Status != PKG_CONSTANTS.C_STATUS1_ENABLE then o_errNumber := 12; l_error_msg := '門店狀態不可用'; raise l_exception; else begin --3.查詢經銷商數據 select * into l_fchsData from t_franchiser tf where tf.fchs_id = l_storeData.Fchs_Id; --判斷經銷商狀態 if l_fchsData.Status != PKG_CONSTANTS.C_STATUS1_ENABLE then o_errNumber := 14; l_error_msg := '經銷商狀態不可用'; raise l_exception; else --查詢區域全部數據 begin select * into l_zoneData from t_zone tz where tz.zone_id = l_fchsData.Zone_Id; --判斷區域狀態是否可用 if l_zoneData.Status != PKG_CONSTANTS.C_STATUS1_ENABLE then o_errNumber := 13; l_error_msg := '區域狀態不可用'; raise l_exception; else o_errNumber := 0; l_error_msg := ''; end if; exception when no_data_found then o_errNumber := PKG_CONSTANTS.C_RTN_FAILURE; l_error_msg := '門店查詢區域數據出錯'; end; end if; exception when no_data_found then o_errNumber := PKG_CONSTANTS.C_RTN_FAILURE; l_error_msg := '門店查詢經銷商數據出錯'; end; end if; exception when no_data_found then o_errNumber := PKG_CONSTANTS.C_RTN_FAILURE; l_error_msg := '門店查詢門店數據出錯'; end; --銷售員 elsif l_rtyAccount.Role_Type = PKG_CONSTANTS.C_ROLETYPE_SELLER then begin --1.根據銷售員代碼去門店表取數據 select * into l_selrData from t_seller tsr where tsr.selr_id = l_rtyAccount.Role_Id; --2.判斷銷售員狀態是否可用 if l_selrData.Status != PKG_CONSTANTS.C_STATUS1_ENABLE then o_errNumber := 12; l_error_msg := '銷售員狀態不可用'; raise l_exception; else begin --查詢門店數據 --1.根據角色代碼去門店表取數據 select * into l_storeData from t_store ts where ts.store_id = l_selrData.Store_Id; --2.判斷門店狀態是否可用 if l_storeData.Status != PKG_CONSTANTS.C_STATUS1_ENABLE then o_errNumber := 15; l_error_msg := '門店狀態不可用'; raise l_exception; else begin --3.查詢經銷商數據 select * into l_fchsData from t_franchiser tf where tf.fchs_id = l_storeData.Fchs_Id; --判斷經銷商狀態 if l_fchsData.Status != PKG_CONSTANTS.C_STATUS1_ENABLE then o_errNumber := 14; l_error_msg := '經銷商狀態不可用'; raise l_exception; else --查詢區域全部數據 begin select * into l_zoneData from t_zone tz where tz.zone_id = l_fchsData.Zone_Id; --判斷區域狀態是否可用 if l_zoneData.Status != PKG_CONSTANTS.C_STATUS1_ENABLE then o_errNumber := 13; l_error_msg := '區域狀態不可用'; raise l_exception; else o_errNumber := 0; l_error_msg := ''; end if; exception when no_data_found then o_errNumber := PKG_CONSTANTS.C_RTN_FAILURE; l_error_msg := '銷售員查詢區域數據出錯'; end; end if; exception when no_data_found then o_errNumber := PKG_CONSTANTS.C_RTN_FAILURE; l_error_msg := '銷售員查詢經銷商數據出錯'; end; end if; exception when no_data_found then o_errNumber := PKG_CONSTANTS.C_RTN_FAILURE; l_error_msg := '銷售員查詢門店數據出錯'; end; end if; exception when no_data_found then o_errNumber := PKG_CONSTANTS.C_RTN_FAILURE; l_error_msg := '銷售員查詢銷售員數據出錯'; end; end if; --end經銷商 exception when l_exception then pkg_utility.sp_writeLog(i_log_type => 'ERROR', i_acc_id => i_account, i_sp_name => 'sp_checkAccount', i_log_desc => l_error_msg); when others then o_errNumber := PKG_CONSTANTS.C_RTN_FAILURE; pkg_utility.sp_writeLog(i_log_type => 'ERROR', i_acc_id => i_account, i_sp_name => 'sp_checkAccount', i_log_desc => l_error_msg); end sp_checkAccount;