-- 2022-02-19
1. 一般来说,一个逻辑块,一个 commit ,目的在日志记录表中跟踪过程的运行轨迹
2. union 去重的时候,每一个模块都可以使用 distinct
3. 如果有存在清表的逻辑,必须考虑如果过程失败,数据回滚复原的场景
4. 和亮总确认,在没有说明的情况下,所有数据都默认拿 有效的数据,
5. 看需求文档,仔细琢磨各个条件值
6. 对于有疑问的条件值,尽快问需求负责人
7. 写完过程,测试主键是否重复,数量值是否跟源表的单个或者汇总值,是否一致
8. 使用 update 的时候,尽量用的字段都有索引,不然会很慢
9. -- 2022-03-03
https://www.cnblogs.com/augus007/articles/9309479.html
最高效的删除重复记录方法 ( 因为使用了 ROWID)
DELETE FROM EMP E
WHERE E.ROWID >(SELECT MIN(X.ROWID) FROM EMP X
WHERE X.EMP_NO = E.EMP_NO);
/******************************************************
DWMGR 开发模板
*******************************************************/
/*
Ver by date mark
1.0 V53368915 2021-12-29 create #1521007 新建需求评审导出和导入功能
*/
PROCEDURE p_ui_dp_rpt(p_parameter IN VARCHAR2,
p_oflow_id IN VARCHAR2,
p_oflow_name IN VARCHAR2,
p_err_code OUT NUMBER) AS
v_task_name VARCHAR2(200) := 'p_ui_dp_rpt.' || p_parameter;
v_sub_task VARCHAR2(200);
v_msg VARCHAR2(4000);
BEGIN
dwmgr.pkg_iplan_log.write_task_log(gv_module_name,
v_task_name,
'Start',
v_msg,
p_oflow_id,
p_oflow_name);
--创建新分区
v_sub_task := '.add partition';
dwmgr.pkg_iplan_log.write_task_log(i_module_name => gv_module_name,
i_task_name => v_task_name ||
v_sub_task,
i_status => 'Start',
i_msg => v_msg,
i_oflow_id => p_oflow_id,
i_oflow_name => p_oflow_name);
--头表分区
dwmgr.pkg_iplan_util.p_add_partition(p_oflow_id,
p_oflow_name,
p_err_code,
'UI_DP_RPT_HEADER',
'PART_' ||
to_char(v_plan_id, 'YYYYMMDD'),
to_char(v_plan_id, 'YYYYMMDD'));
--行表分区
dwmgr.pkg_iplan_util.p_add_partition(p_oflow_id,
p_oflow_name,
p_err_code,
'UI_DP_RPT_LINE',
'PART_' ||
to_char(v_plan_id, 'YYYYMMDD'),
to_char(v_plan_id, 'YYYYMMDD'));
dwmgr.pkg_iplan_log.write_task_log(i_module_name => gv_module_name,
i_task_name => v_task_name ||
v_sub_task,
i_status => 'End',
i_msg => v_msg,
i_oflow_id => p_oflow_id,
i_oflow_name => p_oflow_name);
-- 初始化需求评审头表
v_sub_task := '.insert ui_dp_rpt_header';
dwmgr.pkg_iplan_log.write_task_log(i_module_name => gv_module_name,
i_task_name => v_task_name ||
v_sub_task,
i_status => 'Start',
i_msg => v_msg,
i_oflow_id => p_oflow_id,
i_oflow_name => p_oflow_name);
v_msg := 'rows=' || SQL%ROWCOUNT;
COMMIT;
dwmgr.pkg_iplan_log.write_task_log(gv_module_name,
v_task_name || v_sub_task,
'End',
v_msg,
p_oflow_id,
p_oflow_name);
v_msg := 'Success';
p_err_code := 0;
dwmgr.pkg_iplan_log.write_task_log(gv_module_name,
v_task_name,
'End',
v_msg,
p_oflow_id,
p_oflow_name);
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
p_err_code := SQLCODE;
v_msg := substr(dbms_utility.format_error_stack ||
dbms_utility.format_error_backtrace,
1,
4000);
dwmgr.pkg_iplan_log.write_task_log(gv_module_name,
v_task_name,
'Failed',
v_msg,
p_oflow_id,
p_oflow_name);
dwmgr.pkg_iplan_log.write_task_log(gv_module_name,
v_task_name || v_sub_task,
'Failed',
v_msg,
p_oflow_id,
p_oflow_name);
raise_application_error(-20001, v_msg);
END p_ui_dp_rpt;
/******************************************************
SOPMGR 开发模板
1. 一个过程,一个 commit
2. 如果有存在清表的逻辑,必须考虑如果过程失败,数据回滚复原的场景
*******************************************************/
/******************************************************************************
PURPOSE: SKU-销售组织对应关系主数据校验,数据从 IN_SOP_DMR 至 MST_SOP_DMR
Ver Date Author Description
--------- ---------- --------------- ------------------------------------
1.0 2022-01-14 V53368915 Created.
******************************************************************************/
PROCEDURE proc_valid_dmr(parameter IN VARCHAR2
,workflow_name IN VARCHAR2
,workflow_id IN VARCHAR2
,p_err_code OUT NUMBER) AS
v_task_name VARCHAR2(30) := 'proc_valid_dmr';
v_msg VARCHAR2(4000);
BEGIN
p_err_code := -20999;
IF v_plan_id_count != 1
THEN
p_err_code := SQLCODE; /* sqlcode:sqlcode函数用来返回pl/sql执行内部异常代码。其中 0 表示成功;-1 表示失败;100 表示没有检索到数据;+1 表示用户自定义异常。 */
v_msg := 'in_sop_md_cube_sop_rtf 接口无数据或数据版本不唯一, 请联系ESP关键用户检查daily rtf 数据';
sopmgr.pkg_iplan_log.write_task_log(gv_module_name,
v_task_name,
'Failed',
v_msg,
workflow_id,
workflow_name);
raise_application_error(-20001, v_msg);
END IF;
sopmgr.pkg_iplan_log.write_task_log(gv_module_name,
v_task_name,
'Start',
v_msg,
workflow_id,
workflow_name);
sopmgr.pkg_iplan_log.write_task_log_once(gv_module_name,
v_task_name,
'parameter: ' || parameter,
workflow_id,
workflow_name);
v_msg := 'Success!';
p_err_code := 0;
sopmgr.pkg_iplan_log.write_task_log(gv_module_name,
v_task_name,
'End',
v_msg,
workflow_id,
workflow_name);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
p_err_code := SQLCODE;
v_msg := substr(dbms_utility.format_error_stack ||
dbms_utility.format_error_backtrace,
1,
4000);
sopmgr.pkg_iplan_log.write_task_log(gv_module_name,
v_task_name,
'Failed',
v_msg,
workflow_id,
workflow_name);
raise_application_error(-20001, v_msg);
END proc_valid_dmr;
-- 2022-01-27
开发的表格一般都有如下字段:
sys_created_date DATE default sysdate,
sys_created_by VARCHAR2(64) default 'SYSTEM',
sys_created_by_name VARCHAR2(64) default 'SYSTEM',
sys_last_modified_date DATE default sysdate,
sys_last_modified_by VARCHAR2(64) default 'SYSTEM',
sys_last_modified_by_name VARCHAR2(64) default 'SYSTEM',
sys_last_modified_by_version NUMBER default 0
;
comment on column dwmgr.ui_sop_rpt_header.sys_created_date is '创建时间 默认为当前系统时间,sysdate';
comment on column dwmgr.ui_sop_rpt_header.sys_created_by is '创建人工号 默认为SYSTEM';
comment on column dwmgr.ui_sop_rpt_header.sys_created_by_name is '创建人名称 默认为SYSTEM';
comment on column dwmgr.ui_sop_rpt_header.sys_last_modified_date is '最后更新时间 默认为当前系统时间,sysdate';
comment on column dwmgr.ui_sop_rpt_header.sys_last_modified_by is '最后更新人工号 默认为SYSTEM';
comment on column dwmgr.ui_sop_rpt_header.sys_last_modified_by_name is '最后更新人名称 默认为SYSTEM';
comment on column dwmgr.ui_sop_rpt_header.sys_last_modified_by_version is '最后更新版本,流水码,逐渐递增+1,默认为0';