Oracle --%type和%rowtype

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;
相關文章
相關標籤/搜索