oracle package 和package body

ORACLE中的function   、package、package   bodies、procedure的区别和相同:

  • function有返回值,有参数;
  • procedure无返回值,有参数;
  • package、package   body是同时存在的,就像.h和.cpp文件如果要外部调用的,就在package里声明一下,包内调用的,只要在body里写就行了

 

创建package

create or replace package cus_csh_payment_wfl_pkg is

  -- Author  : gaoyang
  -- Created : 2016-4-4 9:14:48
  -- Purpose : 

  procedure auto_create_csh_payment(p_contract_id number, p_user_id number);//调用需要在这里声明

  procedure calc_due_date_after_print(p_contract_id number,
                                      p_user_id     number);//调用需要在这里声明
end cus_csh_payment_wfl_pkg;

 

创建package bodies

create or replace package body cus_csh_payment_wfl_pkg is

  e_lock_error exception;
  pragma exception_init(e_lock_error, -54);

  procedure lock_con_contract(p_contract_id  number,
                              p_user_id      number,
                              p_con_contract out con_contract%rowtype) is
  begin
    select *
      into p_con_contract
      from con_contract t
     where t.contract_id = p_contract_id
       for update nowait;
  
  exception
    when e_lock_error then
      sys_raise_app_error_pkg.raise_sys_others_error(p_message                 => '该合同资源正忙,请稍后再试',
                                                     p_created_by              => p_user_id,
                                                     p_package_name            => 'cus_csh_payment_wfl_pkg',
                                                     p_procedure_function_name => 'lock_con_contract');
      raise_application_error(sys_raise_app_error_pkg.c_error_number,
                              sys_raise_app_error_pkg.g_err_line_id);
  end;

  procedure lock_csh_payment_req_hd(p_payment_req_id         in number,
                                    p_user_id                in number,
                                    p_csh_payment_req_hd_rec out csh_payment_req_hd%rowtype) is
  
  begin
    select *
      into p_csh_payment_req_hd_rec
      from csh_payment_req_hd t
     where t.payment_req_id = p_payment_req_id
       for update nowait;
  
  exception
    when e_lock_error then
      sys_raise_app_error_pkg.raise_user_define_error(p_message_code            => 'CSH_TRANSACTION_PKG.CSH510_LOCK',
                                                      p_created_by              => p_user_id,
                                                      p_package_name            => 'cus_csh_payment_wfl_pkg',
                                                      p_procedure_function_name => 'lock_csh_payment_req_hd');
      raise_application_error(sys_raise_app_error_pkg.c_error_number,
                              sys_raise_app_error_pkg.g_err_line_id);
  end;

  procedure ins_csh_payment_req_ln_ddct(p_payment_req_ln_id number,
                                        p_ref_doc_category  varchar2,
                                        p_ref_doc_id        number,
                                        p_ref_doc_line_id   number,
                                        p_amount            number,
                                        p_principal         number,
                                        p_interest          number,
                                        p_user_id           number) is
  begin
    insert into csh_payment_req_ln_ddct
      (payment_req_ln_ddct_id,
       payment_req_ln_id,
       ref_doc_category,
       ref_doc_id,
       ref_doc_line_id,
       amount,
       principal,
       interest,
       deduction_flag,
       creation_date,
       created_by,
       last_update_date,
       last_updated_by)
    values
      (csh_payment_req_ln_ddct_s.nextval,
       p_payment_req_ln_id,
       p_ref_doc_category,
       p_ref_doc_id,
       p_ref_doc_line_id,
       p_amount,
       p_principal,
       p_interest,
       'N',
       sysdate,
       p_user_id,
       sysdate,
       p_user_id);
  end;

  procedure delete_csh_payment_req_ln_tmp(p_session_id in number,
                                          p_type       in varchar2 default null) is
  begin
    delete from csh_payment_req_ln_tmp
     where session_id = p_session_id
       and type = nvl(p_type, type);
  end;

  procedure insert_csh_payment_req_ln_tmp(p_session_id in number,
                                          p_id         in number,
                                          p_type       in varchar2,
                                          p_amt        in number default null) is
  begin
    insert into csh_payment_req_ln_tmp
      (session_id, type, id, amt)
    values
      (p_session_id, p_type, p_id, p_amt);
  
  end;

  --自动分配收付抵扣
  procedure auto_allocation_ddct(p_session_id     in number,
                                 p_payment_req_id in number,
                                 p_user_id        in number) is
    v_req_amt   number;
    v_trx_amt   number;
    v_trx_amt_p number;
    v_trx_amt_i number;
    v_amt       number;
    v_amt_p     number;
    v_amt_i     number;
  
    r_payment_req_rec csh_payment_req_hd%rowtype;
  begin
    select *
      into r_payment_req_rec
      from csh_payment_req_hd
     where payment_req_id = p_payment_req_id;
  
    --清除原分配数据
    delete from csh_payment_req_ln_ddct p
     where p.payment_req_ln_id in
           (select t.id
              from csh_payment_req_ln_tmp t
             where t.session_id = p_session_id
               and t.type = 'PAYMENT_REQ_LN');
  
    for c_payment_req in (select l.payment_req_ln_id,
                                 l.bp_id,
                                 l.amount -
                                 nvl((select sum(d.write_off_amt)
                                       from csh_payment_req_ln_prepay d
                                      where d.payment_req_ln_id =
                                            l.payment_req_ln_id
                                        and nvl(d.write_off_flag, 'N') = 'N'),
                                     0) as amount,
                                 l.ref_doc_id as contract_id,
                                 l.ref_doc_line_id as cashflow_id,
                                 c.pay_type
                            from csh_payment_req_ln     l,
                                 csh_payment_req_ln_tmp t,
                                 con_contract           c,
                                 con_contract_cashflow  ccc
                           where t.session_id = p_session_id
                             and t.type = 'PAYMENT_REQ_LN'
                             and l.payment_req_ln_id = t.id
                             and l.payment_req_ln_type = 'DEBT'
                             and l.ref_doc_id = c.contract_id
                             and l.ref_doc_category = 'CONTRACT'
                             and l.ref_doc_line_id = ccc.cashflow_id
                             and ccc.cf_item = 5
                           order by c.contract_id,
                                    ccc.cf_item,
                                    l.payment_req_ln_id) loop
    
      v_req_amt := c_payment_req.amount;
    
      for c_cashflow in (select ccc.contract_id,
                                ccc.cashflow_id,
                                ccc.cf_item,
                                ccc.due_amount - nvl(ccc.received_amount, 0) as due_amount,
                                ccc.principal -
                                nvl(ccc.received_principal, 0) as principal,
                                ccc.interest - nvl(ccc.received_interest, 0) as interest
                           from con_contract_cashflow ccc
                          where ccc.contract_id = c_payment_req.contract_id
                            and ccc.cf_direction = 'INFLOW'
                            and ccc.cf_status = 'RELEASE'
                            and ccc.write_off_flag <> 'FULL'
                           -- and ccc.times = 0  modify by xuls 2016-11-18 不限制0期间
                            and (ccc.cf_type in (2, 3, 5/*,8*/,6)
                            or (ccc.cf_type in ('908','12') and ccc.times=0)
                            )
                          order by ccc.cf_item) loop
        select c_cashflow.due_amount - nvl(sum(d.amount), 0),
               c_cashflow.principal - nvl(sum(d.principal), 0),
               c_cashflow.interest - nvl(sum(d.interest), 0)
          into v_trx_amt, v_trx_amt_p, v_trx_amt_i
          from csh_payment_req_ln_ddct d
         where d.payment_req_ln_id = c_payment_req.payment_req_ln_id
           and d.ref_doc_category = 'CONTRACT'
           and d.ref_doc_line_id = c_cashflow.cashflow_id
           and nvl(d.deduction_flag, 'N') = 'N';
        --金额为0时,退出循环
        if v_trx_amt > 0 then
        
          if v_req_amt > v_trx_amt then
            v_amt := v_trx_amt;
          else
            v_amt := v_req_amt;
          end if;
        
          --分配本息
          if c_cashflow.cf_item = 1 then
            if v_trx_amt_i >= v_amt then
              v_amt_i := v_amt;
              v_amt_p := 0;
            else
              v_amt_i := v_trx_amt_i;
              v_amt_p := v_amt - v_amt_i;
            end if;
          else
            v_amt_p := null;
            v_amt_i := null;
          end if;
        
          ins_csh_payment_req_ln_ddct(p_payment_req_ln_id => c_payment_req.payment_req_ln_id,
                                      p_ref_doc_category  => 'CONTRACT',
                                      p_ref_doc_id        => c_cashflow.contract_id,
                                      p_ref_doc_line_id   => c_cashflow.cashflow_id,
                                      p_amount            => v_amt,
                                      p_principal         => v_amt_p,
                                      p_interest          => v_amt_i,
                                      p_user_id           => p_user_id);
        
          v_req_amt := v_req_amt - v_amt;
          exit when v_req_amt <= 0;
        
        end if;
      
      end loop;
    
    end loop;
  
    delete from csh_payment_req_ln_tmp
     where session_id = p_session_id
       and type in ('PREPAYMENT_TRX', 'PAYMENT_REQ_LN');
  
  end;

  procedure csh_payment_req_amount_check(p_cashflow_id number,
                                         p_amount      number,
                                         p_company_id  number,
                                         p_user_id     number) is
    e_req_amount_check exception;
    e_req_amount_zero_check exception;
    v_due_amount       number;
    v_amount           number;
    v_amount_paid      number;
    v_amount_approving number;
  
  begin
    select nvl(f.due_amount, 0)
      into v_due_amount
      from con_contract_cashflow f
     where f.cashflow_id = p_cashflow_id;
  
    select sum(l.amount)
      into v_amount
      from csh_payment_req_ln l, csh_payment_req_hd h
     where l.ref_doc_line_id = p_cashflow_id
       and l.payment_req_id = h.payment_req_id
       and h.submitted_flag = 'Y'
       and h.approval_status = 'APPROVED'
       and nvl(h.closed_flag, 'N') <> 'Y';
  
    select sum(nvl(l.amount_paid, 0))
      into v_amount_paid
      from csh_payment_req_ln l, csh_payment_req_hd h
     where l.ref_doc_line_id = p_cashflow_id
       and l.payment_req_id = h.payment_req_id
       and h.submitted_flag = 'Y'
       and h.approval_status = 'APPROVED'
       and nvl(h.closed_flag, 'N') = 'Y';
  
    select sum(l.amount)
      into v_amount_approving
      from csh_payment_req_ln l, csh_payment_req_hd h
     where l.ref_doc_line_id = p_cashflow_id
       and l.payment_req_id = h.payment_req_id
       and h.submitted_flag = 'Y'
       and h.approval_status = 'APPROVING';
  
    if p_amount > (v_due_amount - nvl(v_amount, 0) - nvl(v_amount_paid, 0) -
       nvl(v_amount_approving, 0)) then
      raise e_req_amount_check;
    elsif p_amount = 0 or p_amount is null then
      raise e_req_amount_zero_check;
    end if;
  
  exception
    when e_req_amount_check then
      sys_raise_app_error_pkg.raise_user_define_error(p_message_code            => 'CSH_PAYMENT_REQ_PKG.CSH501_REQ_AMOUNT_CHECK',
                                                      p_created_by              => p_user_id,
                                                      p_package_name            => 'cus_csh_payment_wfl_pkg',
                                                      p_procedure_function_name => 'csh_payment_req_amount_check');
      raise_application_error(sys_raise_app_error_pkg.c_error_number,
                              sys_raise_app_error_pkg.g_err_line_id);
    
    when e_req_amount_zero_check then
      sys_raise_app_error_pkg.raise_user_define_error(p_message_code            => 'CSH_PAYMENT_REQ_PKG.CSH501_REQ_AMOUNT_ZERO_CHECK',
                                                      p_created_by              => p_user_id,
                                                      p_package_name            => 'cus_csh_payment_wfl_pkg',
                                                      p_procedure_function_name => 'csh_payment_req_amount_check');
      raise_application_error(sys_raise_app_error_pkg.c_error_number,
                              sys_raise_app_error_pkg.g_err_line_id);
  end;

  procedure auto_create_csh_payment(p_contract_id number, p_user_id number) is
    r_con_contract con_contract%rowtype;
    e_con_status_error exception;
    v_payment_req_id      number;
    v_anget_bp_id         number;
    v_payment_req_ln_id   number;
    v_5_payment_req_ln_id number;
    v_instance_id         number;
    v_session_id          number;
    v_document_type       con_contract.document_type%type;
    -- v_cashflow_rec           con_contract_cashflow%rowtype;
    v_bp_bank_account_rec    hls_bp_master_bank_account%rowtype;
    v_csh_payment_req_hd_rec csh_payment_req_hd%rowtype;
  
    v_sum_due_amount number;
  
    e_agent_bank_account_error exception;
  begin
  
    lock_con_contract(p_contract_id  => p_contract_id,
                      p_user_id      => p_user_id,
                      p_con_contract => r_con_contract);
  
    select d.wfl_instance_id
      into v_instance_id
      from prj_project d
     where d.project_id = r_con_contract.project_id;
  
    if r_con_contract.contract_status <> 'SIGN' then
      raise e_con_status_error;
    end if;
    
    select cc.document_type
    into v_document_type
    from con_contract cc
    where cc.contract_id=p_contract_id;
  
    if v_document_type = 'CARCON' then
    select t.bp_id
      into v_anget_bp_id
      from con_contract_bp t
     where t.bp_category = 'AGENT'
       and t.enabled_flag = 'Y'
       and t.contract_id = r_con_contract.contract_id
       and rownum = 1;
    elsif v_document_type = 'PRJCON' then
      v_anget_bp_id := r_con_contract.unit_id;
    else
      null;
    end if;
  
    begin
      select *
        into v_bp_bank_account_rec
        from hls_bp_master_bank_account t
       where t.bp_id = v_anget_bp_id
         and t.enabled_flag = 'Y'
         and rownum=1;
    exception
      when no_data_found then
        raise e_agent_bank_account_error;
    end;
  
    select sum(cfl.due_amount)
      into v_sum_due_amount
      from con_contract_cashflow cfl
     where cfl.contract_id = r_con_contract.contract_id
       and cfl.times = 0
          -- and cfl.cf_item = 5
        and cfl.cf_item != 81 --GPS费用单独发起付款申请  add by Spencer 3893 20160819
       and cfl.cf_direction = 'OUTFLOW'
       and cfl.cf_status = 'RELEASE';
  
    csh_payment_req_pkg.ins_csh_payment_req_hd(p_payment_req_id       => v_payment_req_id,
                                               p_company_id           => r_con_contract.company_id,
                                               p_document_type        => 'STD_PAYMENT_REQ',
                                               p_payment_req_number   => null,
                                               p_req_date             => sysdate,
                                               p_apply_pay_date       => sysdate,
                                               p_transaction_category => 'BUSINESS',
                                               p_distribution_set_id  => '',
                                               p_payment_method_id    => null,
                                               p_bp_id                => v_anget_bp_id,
                                               p_bp_category          => 'AGENT',
                                               -- p_amount               => v_cashflow_rec.due_amount,
                                               p_amount               => v_sum_due_amount,
                                               p_currency_code        => r_con_contract.currency,
                                               p_description          => null,
                                               p_submitted_flag       => 'N',
                                               p_printed_flag         => 'N',
                                               p_printed_times        => 0,
                                               p_last_print_date      => null,
                                               p_closed_flag          => 'N',
                                               p_closed_date          => sysdate,
                                               p_closed_note          => null,
                                               p_approval_status      => null,
                                               p_approval_date        => null,
                                               p_approval_note        => null,
                                               p_bp_bank_account_id   => v_bp_bank_account_rec.bank_account_id,
                                               p_bp_bank_account_num  => v_bp_bank_account_rec.bank_account_num,
                                               p_bp_bank_account_name => v_bp_bank_account_rec.bank_account_name,
                                               p_business_type        => 'PAYMENT',
                                               p_branch_id            => v_bp_bank_account_rec.branch_id,
                                               p_city_id              => v_bp_bank_account_rec.city_id,
                                               p_user_id              => p_user_id);
  
    for v_cashflow_rec in (select *
                             from con_contract_cashflow cfl
                            where cfl.contract_id =
                                  r_con_contract.contract_id
                              and cfl.times = 0
                                 -- and cfl.cf_item = 5
                              and cfl.cf_item != 81 --GPS费用单独发起付款申请 add by Spencer 3893 20160819
                              and cfl.cf_direction = 'OUTFLOW'
                              and cfl.cf_status = 'RELEASE') loop
      v_payment_req_ln_id := '';
      csh_payment_req_pkg.ins_csh_payment_req_ln(p_payment_req_ln_id      => v_payment_req_ln_id,
                                                 p_payment_req_id         => v_payment_req_id,
                                                 p_payment_req_ln_type    => 'DEBT',
                                                 p_ref_doc_category       => 'CONTRACT',
                                                 p_ref_doc_id             => r_con_contract.contract_id,
                                                 p_ref_doc_line_id        => v_cashflow_rec.cashflow_id,
                                                 p_bp_id                  => v_anget_bp_id,
                                                 p_currency_code          => r_con_contract.currency,
                                                 p_amount                 => v_cashflow_rec.due_amount,
                                                 p_amount_paid            => 0,
                                                 p_description            => null,
                                                 p_payment_status         => 'NOT',
                                                 p_payment_completed_date => null,
                                                 p_apply_pay_date         => sysdate,
                                                 p_payment_method_id      => null,
                                                 p_bank_account_id        => null,
                                                 p_bank_account_num       => null,
                                                 p_bank_account_name      => null,
                                                 p_bank_branch_name       => null,
                                                 p_bp_bank_account_id     => v_bp_bank_account_rec.bank_account_id,
                                                 p_bp_bank_account_num    => v_bp_bank_account_rec.bank_account_num,
                                                 p_bp_bank_account_name   => v_bp_bank_account_rec.bank_account_name,
                                                 p_user_id                => p_user_id,
                                                 p_company_id             => r_con_contract.company_id);
    
      if v_cashflow_rec.cf_item = 5 then
        v_5_payment_req_ln_id := v_payment_req_ln_id;
      end if;
    
    end loop;
    lock_csh_payment_req_hd(p_payment_req_id         => v_payment_req_id,
                            p_user_id                => p_user_id,
                            p_csh_payment_req_hd_rec => v_csh_payment_req_hd_rec);
  
    for csh_payment_req_ln_rec in (select *
                                     from csh_payment_req_ln l
                                    where l.payment_req_id =
                                          v_payment_req_id) loop
    
      csh_payment_req_amount_check(p_cashflow_id => csh_payment_req_ln_rec.ref_doc_line_id,
                                   p_amount      => csh_payment_req_ln_rec.amount,
                                   p_company_id  => r_con_contract.company_id,
                                   p_user_id     => p_user_id);
    end loop;
    update csh_payment_req_hd
       set approval_status  = 'APPROVING',
           wfl_instance_id  = v_instance_id,
           last_updated_by  = p_user_id,
           last_update_date = sysdate
     where payment_req_id = v_payment_req_id;
  
    update csh_payment_req_hd t
       set t.submitted_flag = 'Y'
     where t.payment_req_id = v_payment_req_id;
  
    --设置工作流参数
    zj_wfl_core_pkg.set_parameter_value(p_instance_id     => v_instance_id,
                                        p_parameter_name  => 'PAYMENT_REQ_ID',
                                        p_parameter_value => v_payment_req_id,
                                        p_user_id         => p_user_id);
  
    v_session_id := v_payment_req_id * -1;
    --默认收付抵扣首付款和保证金,贴息
    --if v_document_type = 'CARCON' then
    for r_cashflow in (select cfl.due_amount
                         from con_contract_cashflow cfl
                        where cfl.contract_id = r_con_contract.contract_id
                          and cfl.cf_status = 'RELEASE'
                          and (cfl.cf_item in (2, 3, 51,/*8,*/61)
                            or (cfl.cf_item in('913','912','12') and times=0)
                          )
                          --and cfl.times = 0  modify by xuls 2016-11-18不限制  0期
                          AND cfl.write_off_flag <> 'FULL'--add by Spencer 3893 20160819 
                          ) loop
    
      insert_csh_payment_req_ln_tmp(p_session_id => v_session_id,
                                    p_id         => v_5_payment_req_ln_id,
                                    p_type       => 'PAYMENT_REQ_LN',
                                    p_amt        => r_cashflow.due_amount);
    end loop;
    --end if;
    auto_allocation_ddct(p_session_id     => v_session_id,
                         p_payment_req_id => v_payment_req_id,
                         p_user_id        => p_user_id);
  
  exception
    when e_con_status_error then
      sys_raise_app_error_pkg.raise_sys_others_error(p_message                 => '只有签约状态的合同才允许此操作!',
                                                     p_created_by              => p_user_id,
                                                     p_package_name            => 'cus_csh_payment_wfl_pkg',
                                                     p_procedure_function_name => 'auto_create_csh_payment');
      raise_application_error(sys_raise_app_error_pkg.c_error_number,
                              sys_raise_app_error_pkg.g_err_line_id);
    when e_agent_bank_account_error then
      sys_raise_app_error_pkg.raise_sys_others_error(p_message                 => '该合同代理商银行账号未维护',
                                                     p_created_by              => p_user_id,
                                                     p_package_name            => 'csh_payment_workflow_pkg',
                                                     p_procedure_function_name => 'auto_create_csh_payment');
      raise_application_error(sys_raise_app_error_pkg.c_error_number,
                              sys_raise_app_error_pkg.g_err_line_id);
    when others then
      sys_raise_app_error_pkg.raise_sys_others_error(p_message                 => dbms_utility.format_error_backtrace || ' ' ||
                                                                                  sqlerrm,
                                                     p_created_by              => p_user_id,
                                                     p_package_name            => 'csh_payment_workflow_pkg',
                                                     p_procedure_function_name => 'auto_create_csh_payment');
      raise_application_error(sys_raise_app_error_pkg.c_error_number,
                              sys_raise_app_error_pkg.g_err_line_id);
  end;

  procedure calc_due_date_after_print(p_contract_id number,
                                      p_user_id     number) is
    r_con con_contract%rowtype;
    v_contract_status varchar2(30);
  begin
    NULL;
   /* select cc.contract_status
    into v_contract_status
    from con_contract cc
    where cc.contract_id = p_contract_id;
    if v_contract_status = 'NEW' or v_contract_status = 'SIGN' then
    lock_con_contract(p_contract_id  => p_contract_id,
                      p_user_id      => p_user_id,
                      p_con_contract => r_con);
  
    con_contract_pkg.create_cf_date(p_contract_rec       => r_con,
                                    p_inception_of_lease => trunc(sysdate));
  
    update con_contract_cashflow cfl
       set cfl.due_date        = sysdate,
           cfl.calc_date       = sysdate,
           cfl.fin_income_date = sysdate
     where cfl.contract_id = p_contract_id
          --and cfl.cf_item = 5
       --and cfl.cf_direction = 'OUTFLOW'modify by 20160818 Spencer 3893 INFLOW也需要更新
       and cfl.cf_status = 'RELEASE'
       and cfl.times = 0;
    end if;*/
  end;

end cus_csh_payment_wfl_pkg;

使用package bodies

 

begin
            		cus_csh_payment_wfl_pkg.calc_due_date_after_print(
            			p_contract_id =>${@contract_id},
                        p_user_id     =>${/session/@user_id});
            	end;

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值