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;