oracle 包和包体与oracle定时器

1、为什么要使用包?

      答:在一个大型项目中,可能有很多模块,而每个模块又有自己的过程、函数等。而这些过程、函数默认是放在一起的(如在PL/SQL中,过程默认都是放在一起的,即Procedures中),这些非常不方便查询和维护,甚至会发生误删除的事件。所以通过使用包就可以分类管理过程和函数。
     而且在包中还可以自定义自定义类型,从而在过程和函数中可以直接使用自定义变量。Oracle中包的概念与JAVA中包的概念非常类似,只是JAVA中的包是为了分类管理类,但是关键字都是package。
     包分两部分,包规范包体

2、包的使用

(1)定义包规范,包规范可单独存在。

--定义包规范
create or replace package p_stu
as
    --定义结构体
    type re_stu is record(
        rname student.name%type,
        rage  student.age%type
    );
    --定义游标
    type c_stu is ref cursor;
    --定义函数
    function numAdd(num1 number,num2 number)return number;
    --定义过程
    procedure GetStuList(cid in varchar2,c_st out c_stu); 
end;

(2)实现包规范,即包体,名称必须一致,同样的游标定义不能出现,但结构体可以,方法、过程必须实现。

--实现包体,名称一致。
create or replace package body p_stu
as
    --游标和结构体,包规范中已声明,包体中不用再声明,直接使用。
    
    --实现方法   
    function numAdd(num1 number,num2 number)return number
    as
        num number;
    begin
        num:=num1+num2;
        return num;
    end;
    
    --实现过程
    procedure GetStuList(cid varchar2,c_st out c_stu)
    as
        r_stu re_stu; --直接使用包规范中的结构
    begin
        open c_st for select name,age from student where classid=cid;
       -- 如果已经在过程中遍历了游标,在使用这个过程的块中,将没有值。
       -- loop
       --     fetch c_st into r_stu;  
       --     exit when c_st%notfound;
       --     dbms_output.put_line('姓名='||r_stu.rname);
       -- end loop;
    end;
end;

(3)使用

declare
    c_stu p_stu.c_stu;   --定义包中游标变量
    r_stu p_stu.re_stu;  --定义包中结构体变量
    num number;
begin
    --使用及遍历包中过程返回的结果集
    p_stu.GetStuList('C001',c_stu);
    loop
        fetch c_stu into r_stu;
        exit when c_stu%notfound;
        dbms_output.put_line('姓名='||r_stu.rname);
    end loop;
    
    --使用包中的方法
    select p_stu.numAdd(5,6) into num from dual;
    dbms_output.put_line('Num='||num);
end;

3.定时器的包体

 3.1定义定时器的时间记录表

-- Create table
create table ECC_EPM.MNG_SYN_TASK
(
  OID              NUMBER not null,
  DATA_TYPE        VARCHAR2(40),
  BEGIN_TIME       DATE,
  END_TIME         DATE,
  STATE            VARCHAR2(20),
  ENABLED_FLAG     VARCHAR2(1),
  MEMO             VARCHAR2(4000),
  CREATION_DATE    DATE,
  CREATED_BY       VARCHAR2(20),
  LAST_UPDATE_DATE DATE,
  LAST_UPDATED_BY  VARCHAR2(20)
)
tablespace ECC_EPM_TSP
  pctfree 10
  pctused 40
  initrans 1
  maxtrans 255
  storage
  (
    initial 1
    next 1
    minextents 1
    maxextents unlimited
  );
-- Add comments to the table 
comment on table ECC_EPM.MNG_SYN_TASK
  is '同步数据任务表';
-- Add comments to the columns 
comment on column ECC_EPM.MNG_SYN_TASK.OID
  is '主键';
comment on column ECC_EPM.MNG_SYN_TASK.DATA_TYPE
  is '同步数据类型';
comment on column ECC_EPM.MNG_SYN_TASK.BEGIN_TIME
  is '开始时间';
comment on column ECC_EPM.MNG_SYN_TASK.END_TIME
  is '截止时间';
comment on column ECC_EPM.MNG_SYN_TASK.STATE
  is '状态';
comment on column ECC_EPM.MNG_SYN_TASK.ENABLED_FLAG
  is '有效标志';
comment on column ECC_EPM.MNG_SYN_TASK.MEMO
  is '备注';
comment on column ECC_EPM.MNG_SYN_TASK.CREATION_DATE
  is '创建时间';
comment on column ECC_EPM.MNG_SYN_TASK.CREATED_BY
  is '创建人';
comment on column ECC_EPM.MNG_SYN_TASK.LAST_UPDATE_DATE
  is '更新日期';
comment on column ECC_EPM.MNG_SYN_TASK.LAST_UPDATED_BY
  is '更新人';
-- Create/Recreate primary, unique and foreign key constraints 
alter table ECC_EPM.MNG_SYN_TASK
  add constraint MNG_SYN_TASK_PK primary key (OID)
  using index 
  tablespace ECC_EPM_IDX_TSP
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
-- Create/Recreate indexes 
create index ECC_EPM.MNG_SYN_TASK_STATE on ECC_EPM.MNG_SYN_TASK (STATE)
  tablespace ECC_EPM_IDX_TSP
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
create index ECC_EPM.MNG_SYN_TASK_TYPE on ECC_EPM.MNG_SYN_TASK (DATA_TYPE)
  tablespace ECC_EPM_IDX_TSP
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );

3.2 定义包,操作定时器时间表

CREATE OR REPLACE PACKAGE ECC_EPM.epm_syn_pkg IS
  /*+===========================================================================+
  版权信息:
  文件名称:epm_syn_pkg
  版本号  :1.0
  创建者  :
  创建日期:2009-5-15
  设计文档:ECC售后服务管理系统_维修返修.pdm 
  内容摘要:此包主要提供同步数据的公用包。
  功能列表:
      fn_get_begin_time      获取同步数据的开始时间
      sp_ins_syn_info        设置同步开始日志
      sp_upd_syn_info        更新同步信息
  +===========================================================================+*/

  v_error_info VARCHAR2(2048); -- 提示信息

  /*+===========================================================================+
  名    称:fn_get_begin_time
  创建日期:2009-5-15
  内容摘要:获取同步数据的开始时间
  调    用:无
  被调用  :
  创建者  :
  被访问表:无
  被更新表:ecc_epm.mng_syn_task
  输    出:E开始时间
  +===========================================================================+*/
  FUNCTION fn_get_begin_time(p_data_type IN VARCHAR2) RETURN DATE;

  /*+===========================================================================+
  名    称:fn_get_dept_name
  创建日期:2009-5-15
  内容摘要:获取部门名称
  调    用:无
  被调用  :
  创建者  :
  被访问表:无
  被更新表:无
  输    出:E开始时间
  +===========================================================================+*/
  FUNCTION fn_get_dept_name(p_dept_id  IN NUMBER,
                            p_language IN VARCHAR2) RETURN VARCHAR2;
  /*+===========================================================================+
  名    称:fn_get_dept_name
  创建日期:2009-5-15
  内容摘要:获取部门名称
  调    用:无
  被调用  :
  创建者  :
  被访问表:无
  被更新表:无
  输    出:E开始时间
  +===========================================================================+*/
  FUNCTION fn_get_product_model_name(p_product_model_id IN NUMBER,
                                     p_language         IN VARCHAR2)
    RETURN VARCHAR2;

  /*+===========================================================================+
  名    称:fn_get_dept_name
  创建日期:2009-5-15
  内容摘要:获取部门名称
  调    用:无
  被调用  :
  创建者  :
  被访问表:无
  被更新表:无
  输    出:E开始时间
  +===========================================================================+*/
  FUNCTION fn_get_product_item_name(p_product_item_id  IN NUMBER,
                                    p_product_model_id IN NUMBER,
                                    p_language         IN VARCHAR2)
    RETURN VARCHAR2;
  /*+===========================================================================+
  名    称:fn_get_employee_name
  创建日期:2009-5-15
  内容摘要:获取员工名称
  调    用:无
  被调用  :
  创建者  :
  被访问表:无
  被更新表:无
  输    出:E开始时间
  +===========================================================================+*/
  FUNCTION fn_get_employee_name(p_employee_id IN NUMBER) RETURN VARCHAR2;

  /*+===========================================================================+
  名    称:sp_ins_syn_info
  创建日期:2009-5-15
  内容摘要:设置同步开始日志
  调    用:无
  被调用  :
  创建者  :
  被访问表:
  被更新表:ecc_epm.mng_syn_task
  输    入: 
            p_data_type  同步数据类型,
            p_begin_time 同步开始时间,
            p_end_time   同步结束时间,
  输    出:p_task_id    任务ID
  +===========================================================================+*/
  PROCEDURE sp_ins_syn_info(p_data_type  IN VARCHAR2,
                            p_begin_time IN DATE,
                            p_end_time   IN DATE,
                            p_task_id    OUT NUMBER);

  /*+===========================================================================+
  名    称:sp_upd_syn_info
  创建日期:2009-5-15
  内容摘要:更新同步信息
  调    用:无
  被调用  :
  创建者  :
  被访问表:无
  被更新表:ecc_epm.mng_syn_task
  输    入: 
            p_task_id    任务ID,
            p_state      状态,
            p_memo       备注
  输    出:
  +===========================================================================+*/
  PROCEDURE sp_upd_syn_info(p_task_id IN NUMBER,
                            p_state   IN VARCHAR2,
                            p_memo    IN VARCHAR2);

/*+===========================================================================+
  名    称:sp_ins_mail_info
  创建日期:2010-9-7
  内容摘要:更新同步信息
  调    用:无
  被调用  :
  创建者  :
  被访问表:无
  被更新表:ECC_FND.ECC_FND_MAILS
  输    入:
            p_mail_to 收件人,
            p_mail_subject 主题,
           p_mail_body    内容
  输    出:
  +===========================================================================+*/
  PROCEDURE sp_ins_mail_info(p_mail_subject IN VARCHAR2,
                            p_mail_body    IN VARCHAR2,
                            p_mail_from    IN VARCHAR2,
                            p_mail_to    IN VARCHAR2) ;
END epm_syn_pkg;

包体

CREATE OR REPLACE PACKAGE BODY ECC_EPM.epm_syn_pkg IS
  /*+===========================================================================+
  版权信息:
  文件名称:epm_syn_pkg
  版本号  :1.0
  创建者  :
  创建日期:2009-5-15
  设计文档:ECC售后服务管理系统_维修返修.pdm 
  内容摘要:此包主要提供同步数据的公用包。
  功能列表:
      fn_get_begin_time      获取同步数据的开始时间
      sp_ins_syn_info        设置同步开始日志
      sp_upd_syn_info        更新同步信息
  +===========================================================================+*/

  /*+===========================================================================+
  名    称:fn_get_begin_time
  创建日期:2009-5-15
  内容摘要:获取同步数据的开始时间
  调    用:无
  被调用  :
  创建者  :
  被访问表:无
  被更新表:ecc_epm.mng_syn_task
  输    出:E开始时间
  +===========================================================================+*/
  FUNCTION fn_get_begin_time(p_data_type IN VARCHAR2) RETURN DATE IS
    d_time DATE;
  BEGIN
    d_time := to_date('1900-01-01 00:00:00',
                      'YYYY-MM-DD HH24:MI:SS');
    BEGIN
      -- 获取上次同步的截止时间作为开始时间
      SELECT nvl(MAX(end_time),
                 d_time) --转换为日期格式
        INTO d_time
        FROM ecc_epm.mng_syn_task t
       WHERE data_type = p_data_type
         AND t.state = 'succeed'
         AND t.enabled_flag = 'T';
    EXCEPTION
      WHEN OTHERS THEN
        NULL;
    END;
  
    RETURN d_time; -- 返回得到的时间
  
  END fn_get_begin_time;

  /*+===========================================================================+
  名    称:fn_get_dept_name
  创建日期:2009-5-15
  内容摘要:获取部门名称
  调    用:无
  被调用  :
  创建者  :
  被访问表:无
  被更新表:无
  输    出:E开始时间
  +===========================================================================+*/
  FUNCTION fn_get_dept_name(p_dept_id  IN NUMBER,
                            p_language IN VARCHAR2) RETURN VARCHAR2 IS
    v_dept_name_cn VARCHAR2(200) := '';
    v_dept_name_en VARCHAR2(200) := '';
    v_dept_name    VARCHAR2(200) := '';
  BEGIN
    BEGIN
      SELECT dept_name,
             eng_dept_name
        INTO v_dept_name_cn,
             v_dept_name_en
        FROM ecc_fnd.ecc_fnd_dept_v h
       WHERE h.dept_id = p_dept_id
         AND rownum = 1;
    EXCEPTION
      WHEN OTHERS THEN
        NULL;
    END;
    IF p_language = 'EN' THEN
      v_dept_name := v_dept_name_cn;
    ELSE
      v_dept_name := v_dept_name_en;
    END IF;
  
    RETURN v_dept_name; -- 返回得到的时间
  
  END fn_get_dept_name;

  /*+===========================================================================+
  名    称:fn_get_dept_name
  创建日期:2009-5-15
  内容摘要:获取部门名称
  调    用:无
  被调用  :
  创建者  :
  被访问表:无
  被更新表:无
  输    出:E开始时间
  +===========================================================================+*/
  FUNCTION fn_get_product_model_name(p_product_model_id IN NUMBER,
                                     p_language         IN VARCHAR2)
    RETURN VARCHAR2 IS
    v_product_model_name_cn VARCHAR2(200) := '';
    v_product_model_name_en VARCHAR2(200) := '';
    v_product_model_name    VARCHAR2(200) := '';
  BEGIN
    BEGIN
      SELECT cn_name,
             en_name
        INTO v_product_model_name_cn,
             v_product_model_name_en
        FROM ecc_epm.epm_tbl_product_info j
       WHERE line_id = p_product_model_id
         AND rownum = 1;
    EXCEPTION
      WHEN OTHERS THEN
        NULL;
    END;
    IF p_language = 'EN' THEN
      v_product_model_name := v_product_model_name_cn;
    ELSE
      v_product_model_name := v_product_model_name_en;
    END IF;
  
    RETURN v_product_model_name; -- 返回得到的时间
  
  END fn_get_product_model_name;

  /*+===========================================================================+
  名    称:fn_get_dept_name
  创建日期:2009-5-15
  内容摘要:获取部门名称
  调    用:无
  被调用  :
  创建者  :
  被访问表:无
  被更新表:无
  输    出:E开始时间
  +===========================================================================+*/
  FUNCTION fn_get_product_item_name(p_product_item_id  IN NUMBER,
                                    p_product_model_id IN NUMBER,
                                    p_language         IN VARCHAR2)
    RETURN VARCHAR2 IS
    v_product_model_name_cn VARCHAR2(200) := '';
    v_product_model_name_en VARCHAR2(200) := '';
    v_product_item_name_cn  VARCHAR2(200) := '';
    v_product_item_name_en  VARCHAR2(200) := '';
    v_product_item_name     VARCHAR2(200) := '';
  BEGIN
    BEGIN
      SELECT cn_name,
             en_name
        INTO v_product_model_name_cn,
             v_product_model_name_en
        FROM ecc_epm.epm_tbl_product_info j
       WHERE line_id = p_product_model_id
         AND rownum = 1;
    EXCEPTION
      WHEN OTHERS THEN
        NULL;
    END;
  
    BEGIN
      SELECT cn_name,
             en_name
        INTO v_product_item_name_cn,
             v_product_item_name_en
        FROM ecc_epm.epm_tbl_product_info j
       WHERE line_id = p_product_item_id
         AND rownum = 1;
    EXCEPTION
      WHEN OTHERS THEN
        NULL;
    END;
  
    IF p_language = 'EN' THEN
      v_product_item_name := v_product_item_name_cn || '(' ||
                             v_product_model_name_cn || ')';
    ELSE
      v_product_item_name := v_product_item_name_en || '(' ||
                             v_product_model_name_en || ')';
    END IF;
  
    RETURN v_product_item_name; -- 返回得到的时间
  
  END fn_get_product_item_name;

  /*+===========================================================================+
  名    称:fn_get_employee_name
  创建日期:2009-5-15
  内容摘要:获取员工名称
  调    用:无
  被调用  :
  创建者  :
  被访问表:无
  被更新表:无
  输    出:E开始时间
  +===========================================================================+*/
  FUNCTION fn_get_employee_name(p_employee_id IN NUMBER) RETURN VARCHAR2 IS
    v_employee_name VARCHAR2(200) := '';
  BEGIN
    BEGIN
      SELECT employee_name
        INTO v_employee_name
        FROM ecc_fnd.ecc_fnd_emplyees
       WHERE emplyee_id = p_employee_id
         AND rownum = 1;
    
    EXCEPTION
      WHEN OTHERS THEN
        NULL;
    END;
  
    RETURN v_employee_name; -- 返回得到的时间
  
  END fn_get_employee_name;

  /*+===========================================================================+
  名    称:sp_ins_syn_info
  创建日期:2009-5-15
  内容摘要:设置同步开始日志
  调    用:无
  被调用  :
  创建者  :
  被访问表:无
  被更新表:ecc_epm.mng_syn_task
  输    入: 
            p_data_type  同步数据类型,
            p_begin_time 同步开始时间,
            p_end_time   同步结束时间,
  输    出:p_task_id    任务ID
  +===========================================================================+*/
  PROCEDURE sp_ins_syn_info(p_data_type  IN VARCHAR2,
                            p_begin_time IN DATE,
                            p_end_time   IN DATE,
                            p_task_id    OUT NUMBER) IS
  BEGIN
    SELECT ecc_epm.mng_syn_task_s.NEXTVAL --转换为日期格式
      INTO p_task_id
      FROM dual;
  
    --插入启动日志信息
    INSERT INTO ecc_epm.mng_syn_task
      (OID,
       data_type,
       begin_time,
       end_time,
       state,
       memo,
       enabled_flag,
       creation_date)
    VALUES
      (p_task_id,
       p_data_type,
       p_begin_time,
       p_end_time,
       'start',
       '开始同步:' || to_char(SYSDATE,
                          'YYYY-MM-DD HH24:MI:SS'),
       'T',
       SYSDATE);
  
    COMMIT;
  
  END sp_ins_syn_info;

  /*+===========================================================================+
  名    称:sp_upd_syn_info
  创建日期:2009-5-15
  内容摘要:更新同步信息
  调    用:无
  被调用  :
  创建者  :
  被访问表:无
  被更新表:ecc_epm.mng_syn_task
  输    入: 
            p_task_id    任务ID,
            p_state      状态,
            p_memo       备注
  输    出:
  +===========================================================================+*/
  PROCEDURE sp_upd_syn_info(p_task_id IN NUMBER,
                            p_state   IN VARCHAR2,
                            p_memo    IN VARCHAR2) IS
  BEGIN
  
    --设置任务的状态及备注信息
    UPDATE ecc_epm.mng_syn_task t
       SET t.state = p_state,
           t.memo  = t.memo || chr(10) || p_memo,
           t.last_update_date = sysdate
     WHERE t.OID = p_task_id;
  
    COMMIT;
  
  END sp_upd_syn_info;

/*+===========================================================================+
  名    称:sp_ins_mail_info
  创建日期:2010-9-7
  内容摘要:更新同步信息
  调    用:无
  被调用  :
  创建者  :
  被访问表:无
  被更新表:PME.rucl_mail
  输    入:
            p_mail_to 收件人,
            p_mail_subject 主题,
           p_mail_body    内容
  输    出:
  +===========================================================================+*/
  PROCEDURE sp_ins_mail_info(p_mail_subject IN VARCHAR2,
                            p_mail_body    IN VARCHAR2,
                            p_mail_from    IN VARCHAR2,
                            p_mail_to    IN VARCHAR2) IS
  v_mail_to    VARCHAR2(400) := '';                          
  BEGIN
      BEGIN
         select nvl(meaning,3119719) into v_mail_to from ECC_FND.ECC_FND_LOOKUP_CODE 
                where lookup_type='job-monitor' and lookup_code='EPM-TS-HR' and rownum=1;
      EXCEPTION
      WHEN OTHERS THEN
         v_mail_to:='3119719';
      END;          
      if p_mail_to is null then
        null;
      else
        v_mail_to:=p_mail_to;
      end if;
      insert into ECC_FND.ECC_FND_MAILS (mail_id, mail_title,  mail_body,  mail_from, mail_receiver, 
                                        MAIL_MAILTOISONE,
                                        creation_date, 
                                        created_by, 
                                        last_update_date, 
                                        last_updated_by,
                                        mail_newmethod)
      values(ECC_FND.ECC_FND_MAILS_s.nextval,p_mail_subject,p_mail_body,p_mail_from,v_mail_to,
             0,sysdate,0,sysdate,0,1);
  
COMMIT;
  END sp_ins_mail_info ;
END epm_syn_pkg;

 3.3定义一个执行任务的包

create or replace package ecc_epm.epm_pro_req_syn_pkg is
/*+===========================================================================+
  版权信息:
  文件名称:ECC_EPM.epm_pro_req_syn_pkg
  版本号  :1.0
  创建者  :lidaofei
  创建日期:2015-06-17
  设计文档:M01_BU01_UC01 查询合同信息
  内容摘要:此包主要是同步文本合同表(ecc_cpr.ecc_cpr_hc_con_heahers)立项要求
  功能列表: 
     sp_syn_project_requirement     同步立项要求
  
  更新历史:
  更新者    更新日期    更新内容i

  +===========================================================================+*/       
  --标识类型
  data_type_sale_contract CONSTANT VARCHAR2(50) := 'EPM_TBL_PROJECT_REQUIREMENT';
  --运行状态
  succeed CONSTANT VARCHAR2(20) := 'succeed';
  fail    CONSTANT VARCHAR2(20) := 'fail';
  running CONSTANT VARCHAR2(20) := 'running';
  --开始时间
  d_begin_time DATE := TO_DATE('1900-1-1','YYYY-MM-DD');
  --结束时间
  d_end_time   DATE;

  /*+===========================================================================+
  名    称:sp_syn_subcontractor_info
  创建日期:2016-06-17
  内容摘要:同步立项要求
  调    用:无
  被调用  :job
  创建者  :lidaofie
  被访问表:无
  被更新表:ecc_epm.epm_tbl_project_requirement
  输    出:无c
  +===========================================================================+*/
  PROCEDURE sp_syn_project_requirement;

end epm_pro_req_syn_pkg;

包体

create or replace package body ecc_epm.epm_pro_req_syn_pkg is
/*+===========================================================================+
  版权信息:
  文件名称:ECC_EPM.epm_pro_req_syn_pkg
  版本号  :1.0
  创建者  :lidaofei
  创建日期:2015-06-17
  设计文档:M01_BU01_UC01 查询合同信息
  内容摘要:此包主要是同步文本合同表(ecc_cpr.ecc_cpr_hc_con_heahers)立项要求
  功能列表: 
     sp_syn_project_requirement     同步立项要求
  
  更新历史:
  更新者    更新日期    更新内容i

  +===========================================================================+*/       
  

  /*+===========================================================================+
  名    称:sp_syn_subcontractor_info
  创建日期:2016-06-17
  内容摘要:同步立项要求
  调    用:无
  被调用  :job
  创建者  :lidaofie
  被访问表:无
  被更新表:ecc_epm.epm_tbl_project_requirement
  输    出:无c
  +===========================================================================+*/
  PROCEDURE sp_syn_project_requirement is
   --定时任务表主键
   n_task_id number :=0;
   res varchar2(20):= 'artificial';  --默认为人工判断
   must_count number:=0;         --必须立项行数,如果大于0就是必须立项
   not_allow_count number:=0;   --不允许立项行数,如果大于0就是不允许立项
   v_con_id number :=0;         --合同ID
   v_pro_req_count number :=0;  --合同关联立项要求表
   n_update_row NUMBER := 0; 
  begin
    --获取开始时间
    d_begin_time := ECC_EPM.epm_syn_pkg.fn_get_begin_time(data_type_sale_contract);
    --设置当前时间为结束时间
    d_end_time := sysdate;
    --记录同步日志信息
    ECC_EPM.Epm_Syn_Pkg.sp_ins_syn_info(data_type_sale_contract, d_begin_time, d_end_time,n_task_id);
    --更新同步状态与备注
    ECC_EPM.epm_syn_pkg.sp_upd_syn_info(n_task_id,running,
                                        '同步表ecc_epm.BEFOR_PROJECT_CONTRACTS开始:' || to_char(SYSDATE, 'YYYY-MM-DD HH24:MI:SS'));
    
    --游标循环需要设置立项需求数据
    FOR cur IN(select hea.hc_con_id,
                      hea.last_update_date
                from  ecc_cpr.ecc_cpr_hc_con_heahers hea
               where  hea.sieble_id is null
                 and  hea.enabled_flag = 'Y' 
                 and  hea.last_update_date > d_begin_time ) LOOP
          begin       
            v_con_id := cur.hc_con_id;
            res := 'artificial';  
            must_count :=0;         
            not_allow_count :=0;         
            v_pro_req_count :=0;  
            
            --不允许立项(老合同)               
            select count(1)
              into not_allow_count
              from ECC_CPR.ECC_CPR_HC_CON_HEAHERS hea
              left join ecc_fnd.ecc_fnd_depts_v dep on dep.dept_id = hea.dept_id
             where hea.sign_type = '10' --转签合同 /*非框架 and hea.formal_flag||po.po_type||po.po_execute_flag != 'Y'||'101'||'Y'*/
               and hea.hc_con_id = v_con_id
               and EXISTS
             (select 1
                      from (select elc.chinese_name, elc.property_id
                              from ecc_cpr.other_sys_property elc
                             where elc.enabled_flag = 'Y'
                               and elc.property_type = '100') property
                     where property.property_id = hea.contract_property
                       and (property.chinese_name in
                           (select code.lookup_code
                               from ECC_FND.ECC_FND_LOOKUP_CODE code
                              where code.lookup_type = 'PROJECT_REQUIREMENT_NOT_ALLOW')));      
                   
                   
              -- 必须立项 (老合同)
              --1.当前合同属性
              select count(1)
                into must_count
                from ECC_CPR.ECC_CPR_HC_CON_HEAHERS hea
                left join ecc_fnd.ecc_fnd_depts_v dep on dep.dept_id = hea.dept_id
               where hea.sign_type <> '10' --非转签, /*非框架 and hea.formal_flag||po.po_type||po.po_execute_flag != 'Y'||'101'||'Y'*/
                 and hea.hc_con_id = v_con_id
                 and EXISTS
               (select 1
                        from (select elc.chinese_name, elc.property_id
                                from ecc_cpr.other_sys_property elc
                               where elc.enabled_flag = 'Y'
                                 and elc.property_type = '100') property
                       where property.property_id = hea.contract_property
                         and (property.chinese_name in
                             (select code.lookup_code
                                 from ECC_FND.ECC_FND_LOOKUP_CODE code
                                where code.lookup_type = 'PROJECT_REQUIREMENT_MUST') or
                             (property.chinese_name = '客户需求借货' and
                             dep.dept_id in (10389, 5424943))));
              
              --如果当前合同属性不是必须立项的,再验证关联合同是否必须立项
              if must_count = 0 then
                --2.关联合同号是否必须立项
                select count(1)
                  into must_count
                  from ECC_CPR.ECC_CPR_HC_CON_HEAHERS hea
                  left join ecc_fnd.ecc_fnd_depts_v dep on dep.dept_id = hea.dept_id
                 where hea.sign_type != '10'
                   and hea.hc_contract_number in (select h.hc_contract_number
                                                    from ECC_CPR.ECC_CPR_HC_CON_RELATION r
                                                   inner join ECC_CPR.ECC_CPR_HC_CON_RELATION rr on r.group_id =
                                                                                                    rr.group_id
                                                                                                and rr.enabled_flag = 'Y'
                                                                                                and rr.relation_type =
                                                                                                    r.relation_type
                                                                                                and r.hc_con_id !=
                                                                                                    rr.hc_con_id
                                                   inner join ecc_cpr.ecc_cpr_hc_con_heahers h on h.hc_con_id =
                                                                                                  rr.hc_con_id
                                                                                              and h.ENABLED_FLAG != 'N'
                                                   where r.hc_con_id > 0
                                                     and r.relation_type = 10
                                                     and r.enabled_flag = 'Y'
                                                     and r.hc_con_id = v_con_id
                                                  )
                 and EXISTS
                 (select 1
                          from (select elc.chinese_name, elc.property_id
                                  from ecc_cpr.other_sys_property elc
                                 where elc.enabled_flag = 'Y'
                                   and elc.property_type = '100') property
                         where property.property_id = hea.contract_property
                           and (property.chinese_name in
                               (select code.lookup_code
                                   from ECC_FND.ECC_FND_LOOKUP_CODE code
                                  where code.lookup_type = 'PROJECT_REQUIREMENT_MUST') or
                               (property.chinese_name = '客户需求借货' and
                               dep.dept_id in (10389, 5424943))));
             
            end if;
            
            --不允许立项
            if not_allow_count > 0 then
              res := 'notAllow';
            end if;
            
            --必须立项
            if must_count > 0 then
              res := 'must';
            end if;
            
            --更新合同关联的立项要求表
            select count(1)
              into v_pro_req_count
              from ECC_EPM.EPM_TBL_PROJECT_REQUIREMENT req
             where req.hc_con_id = v_con_id;
             
             --如果合同已经存在表中,则更新
             if v_pro_req_count > 0 then
                update ECC_EPM.EPM_TBL_PROJECT_REQUIREMENT req
                   set req.project_requirement = res
                 where req.hc_con_id = v_con_id;
             --否则    
             else 
               insert into ECC_EPM.EPM_TBL_PROJECT_REQUIREMENT req
                 (req.oid, req.hc_con_id, req.project_requirement)
               values
                 (ECC_EPM.EPM_TBL_PROJECT_REQUIREMENT_S.NEXTVAL,v_con_id,res);
             end if;
           
       EXCEPTION
        WHEN OTHERS THEN
          ecc_epm.epm_syn_pkg.sp_upd_syn_info(n_task_id,fail,substr(SQLERRM, 0, 1000) || v_con_id);
       END;
      
      n_update_row := n_update_row + 1;
      IF n_update_row MOD 100 = 0 THEN
        --100倍数时提交一遍
        COMMIT;
      END IF;       
      end loop;
    COMMIT;
      
      ecc_epm.epm_syn_pkg.sp_upd_syn_info(n_task_id, succeed, '同步结束'); 
      EXCEPTION
        WHEN OTHERS THEN
          ecc_epm.epm_syn_pkg.sp_upd_syn_info(n_task_id,fail,substr(SQLERRM, 0, 1000) || v_con_id);                                    
  END;
/*
begin
  -- Initialization
  <Statement>;*/
END epm_pro_req_syn_pkg;

 

posted @ 2016-06-17 22:36  飞翔.  阅读(455)  评论(0编辑  收藏  举报