设为首页 收藏本站
查看: 692|回复: 0

[经验分享] oracle_package\packeage body

[复制链接]

尚未签到

发表于 2016-7-21 10:24:58 | 显示全部楼层 |阅读模式
  
  ---Package

CREATE OR REPLACE PACKAGE TEST_PACKAGE is
-- Author  :  
-- Created :  
-- Purpose :  
/*==================================================================================
* 功能描述: 写数据库日志
*=================================================================================*/
PROCEDURE INSERTlOG(log_person     in VARCHAR2,
log_class      in VARCHAR2,
log_method     in VARCHAR2,
log_info       in VARCHAR2,
log_error_code in VARCHAR2);
END TEST_PACKAGE;
/
GRANT EXECUTE ON TEST.TEST_PACKAGE TO R_TEST_EXEC;

  
  ------Package Body

---Package body的模板
CREATE OR REPLACE PACKAGE BODY TEST_PACKAGE IS
TYPE T_TEST_SEND_INFO IS RECORD(
ID_TEST_SEND_INFO  INF_WECHAT_SEND_INFO.ID_WECHAT_SEND_INFO%TYPE,
ROW_ID             ROWID
);
TYPE TBL_TEST_SEND_INFO IS TABLE OF T_TEST_SEND_INFO INDEX BY BINARY_INTEGER;
----以行插入
PROCEDURE SAVE_TEST_SEND_INFO(V_TEST_SEND_INFO TBL_TEST_SEND_INFO,
O_MSG OUT VARCHAR2) IS
BULK_ERRORS EXCEPTION;
PRAGMA EXCEPTION_INIT(BULK_ERRORS, -24381);
BEGIN
FORALL INDX IN INDICES OF V_TEST_SEND_INFO SAVE EXCEPTIONS
INSERT INTO INF_TEST_SEND_INFO
(ID_TEST_SEND_INFO,
ROWID)
VALUES
(V_TEST_SEND_INFO(INDX).ID_TEST_SEND_INFO,
V_TEST_SEND_INFO(INDX).ROW_ID);
FORALL INDX IN INDICES OF V_TEST_SEND_INFO SAVE EXCEPTIONS
DELETE FROM INF_TEST_SEND_INFO WHERE ROWID=V_TEST_SEND_INFO(INDX).ROW_ID;
EXCEPTION
WHEN BULK_ERRORS THEN
IF O_MSG IS NULL THEN
O_MSG := '插入到微信发送状态流水表异常' || SQLCODE || SUBSTR(SQLERRM, 1, 200);
END IF;
END SAVE_TEST_SEND_INFO;
/************************************
---批量将U数据添加到表中
************************************/
PROCEDURE SAVE_TO_TEST_SEND_INFO(O_MSG OUT VARCHAR2) IS
-- 游标行类型
VTBL_TEST_SEND_INFO TBL_TEST_SEND_INFO;
-- 游标
CURSOR CS_TEST_SEND_INFO IS
SELECT SYS_GUID() ID_TEST_SEND_INFO,
ROWID ROW_ID
FROM TEST_SEND_INFO I
WHERE I.ID_TEST_SEND_INFO IS NOT NULL;
BEGIN
-- 打开游标
OPEN CS_TEST_SEND_INFO;
<<LP_CL_MAIN>>
LOOP
FETCH CS_TEST_SEND_INFO BULK COLLECT INTO VTBL_TEST_SEND_INFO LIMIT 1000;
-- 每1000行保存一次
SAVE_TEST_SEND_INFO(VTBL_TEST_SEND_INFO,O_MSG);
COMMIT;
-- 每1000行提交一次
EXIT LP_CL_MAIN WHEN CS_TEST_SEND_INFO%NOTFOUND;
END LOOP LP_CL_MAIN;
-- 关闭游标
CLOSE CS_TEST_SEND_INFO;
END SAVE_TO_TEST_SEND_INFO;
----插入日志
PROCEDURE INSERTlOG(log_person     in VARCHAR2,
log_class      in VARCHAR2,
log_method     in VARCHAR2,
log_info       in VARCHAR2,
log_error_code in VARCHAR2) is
logPerson varchar2(100);
begin
IF (log_person IS NULL) THEN
logPerson := 'SYSTEM';
ELSE
logPerson := log_person;
END IF;
insert into TEST.TEST_COMM_LOG
(ID_COMM_LOG,
LOG_PERSON,
LOG_CLASS,
LOG_METHOD,
LOG_INFO,
LOG_ERROR_CODE,
LOG_TIME)
values
(SYS_GUID(),
logPerson,
log_class,
log_method,
log_info,
log_error_code,
sysdate);
commit;
end;



END TEST_PACKAGE;
/
  ----triger

--创建数据时CREATED_BY,CREATED_DATE,UPDATED_BY,UPDATED_DATE自动赋值
CREATE OR REPLACE TRIGGER BUSSINESS_BI
BEFORE INSERT ON TEST_BUSSINESS
FOR EACH ROW
DECLARE
V_TRIGGER_USER_CREATED VARCHAR2(100);
V_TRIGGER_USER_UPDATED VARCHAR2(100);
V_TRIGGER_DATE         DATE;
V_STATUS TEST.TR_SWITCH.STATUS%TYPE;
CURSOR C_SWITCH(CP_SWITCH TEST.TR_SWITCH.SWITCH_FOR%TYPE) IS
SELECT STATUS
FROM PADINFODATA.TR_SWITCH
WHERE TRIGGER_NAME = 'INF_BUSSINESS_BI'
AND SWITCH_FOR   = CP_SWITCH;  
V_SQLCODE       VARCHAR2(6);
V_SQLERRM       VARCHAR2(200);
V_ERROR_COMMENT VARCHAR2(300);
BEGIN
V_ERROR_COMMENT := 'BEFORE GET_USER';
--SET CREATED_BY
IF :NEW.CREATED_BY IS NULL THEN
V_TRIGGER_USER_CREATED := USER;
ELSE
V_TRIGGER_USER_CREATED := :NEW.CREATED_BY;
END IF;
--SET UPDATED_BY
IF :NEW.UPDATED_BY IS NULL THEN
V_TRIGGER_USER_UPDATED := V_TRIGGER_USER_CREATED;
ELSE
V_TRIGGER_USER_UPDATED := :NEW.UPDATED_BY;
END IF;
V_TRIGGER_DATE := SYSDATE;
--需求来源:表中记录的审计字段信息的更新
--功能描述:用于保证审计信息的完整性 和一致性
V_ERROR_COMMENT:='BEFORE NETS_INSERT_AUDIT';
OPEN C_SWITCH('NETS_INSERT_AUDIT');       --获取子功能控制信息
FETCH C_SWITCH INTO V_STATUS;
IF C_SWITCH%FOUND AND V_STATUS = '1' THEN
:NEW.CREATED_DATE := V_TRIGGER_DATE;
:NEW.UPDATED_DATE := V_TRIGGER_DATE;
:NEW.CREATED_BY   := V_TRIGGER_USER_CREATED;
:NEW.UPDATED_BY   := V_TRIGGER_USER_UPDATED;
END IF;
CLOSE C_SWITCH;
--出错处理。触发器执行有误,将出错信息插入到tr_error_log表
EXCEPTION
WHEN OTHERS THEN
V_SQLCODE := SQLCODE;
V_SQLERRM := SUBSTR(SQLERRM,1,200);
INSERT INTO TEST.TR_ERROR_LOG
(ERROR_NO          ,         --系统错误代码
ERROR_MESSAGE     ,         --系统错误信息
TRIGGER_NAME      ,         --出错的trigger
TRIGGER_USER      ,         --出错的用户
TRIGGER_DATE      ,         --出错的时间
ERROR_COMMENT               --出错详细信息
)
VALUES
(V_SQLCODE,
V_SQLERRM,
'INF_BUSSINESS_BI',
V_TRIGGER_USER_CREATED,
V_TRIGGER_DATE,
V_ERROR_COMMENT
);
END;
/
  
  
  
  ------
  
  ------
  ------
  
  
  
  
  
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-247275-1-1.html 上篇帖子: ORACLE动态SQL笔记 下篇帖子: Oracle 层次化查询
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表