请教如何往存储过程中传递结果集,DML日志记录

[复制链接]
查看11 | 回复4 | 2007-10-20 08:38:44 | 显示全部楼层 |阅读模式
需求如下:
记录DML操作日志表
假如有一张表:emp,总记录数1000条,在某个存储过程中要对这张表做筛选删除操作,假如删除记录为50条,要求在删除这50条记录同时或者之前,有一张log_emp打头的表能记录这些即将要被删除的50条记录,并且log_emp表和emp结构基本一致,log_emp多了3个字段,分别是log_type,log_reason,以及log_sys_date(默认为sysdate)三个字段.
目前,我的想法是,在删除这50条记录之前,先查询出来并且保存到一个游标中,然后,再调用我的存储过程,里面有两个参数,一个是表名,一个是游标类型的字段,存储过程得到这两个信息后,会动态判断并且生成一张log_打头的表,附加上述说的三个字段,然后把获取的游标的记录得到往刚生成的log表中写入记录.但是目前我这里的难处在于这个游标参数的传递,google上找了好些资料都没用上,小弟不才,望大家帮忙,谢谢:
以下是我写的存储过程的代码,动态创建log表没有问题:
目前这个代码的第二个参数为一个sql的字符串,用动态sql形式,但是这样调用代码要formart这些sql为动态非常不方便,而且很多.或者各位达人有更好的做法也可以指点小弟,谢谢!
CREATE OR REPLACE PROCEDURE p_biz_log( iv_table_namevarchar2,

iv_sql varchar2 )
AS
ln_table number( 11 );
BEGIN
SELECT COUNT( 1 )
INTO ln_table
FROM all_tables
WHERE owner IN ('SPUSER', 'DMABPP')

AND table_name = 'LOG_' || iv_table_name;
IF ln_table = 0
THEN
DBMS_OUTPUT.put_line('CREATE TABLE LOG_' || iv_table_name

|| ' AS SELECT I.*,I.LOG_TYPE LOG_TYPE,I.MSG MSG FROM '

|| iv_table_name

|| ' I');
EXECUTE IMMEDIATE 'CREATE TABLE LOG_'

|| iv_table_name

|| ' AS SELECT I.* FROM '

|| iv_table_name

|| ' I WHERE 1=2';
EXECUTE IMMEDIATE 'ALTER TABLE LOG_'

|| iv_table_name

|| ' ADD (LOG_TYPE VARCHAR2(40 BYTE))';
EXECUTE IMMEDIATE 'ALTER TABLE LOG_'

|| iv_table_name

|| ' ADD (LOG_REASON VARCHAR2(4000 BYTE))';
EXECUTE IMMEDIATE 'ALTER TABLE LOG_'

|| iv_table_name

|| ' ADD (LOG_SYS_DATE DATE DEFAULT SYSDATE)';
END IF;
EXECUTE IMMEDIATE 'INSERT INTO LOG_' || iv_table_name || ' ' || iv_sql;
END;
/
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
删除记录为50条,要求在删除这50条记录同时或者之前,有一张log_emp打头的表能记录这些即将要被删除的50条记录
----------如果我没理解错的话。这个是你的业务需求。可以通过下面2个方法解决
1、基于主键的trigger
2、得到这50条记录的关键字段,循环删除emp表,同时记录到log_emp表里
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
感谢楼上的回答,我也考虑过楼上第一点建议,但是由于涉及这样的triger太多,而且有些表是大表,量在千万级别,所以不够现实,第二点证实我们目前做的,但是项目需求要求这样的操作应该用函数来完成
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
我也做过记录千万级主表的操作记录,不过业务上每次的操作是单行,所以用trigger没发现有什么太大的影响。
如果一次删除多条以至大量数据的话,用过程去解决也是一样的啊。
我不知道你说的函数是不是指DB的function,如果是的话,这个要求就很奇怪了。
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
之所以项目中要求用函数,就是你所说的db的function,是因为我们这个项目以实施为主,目前针对实施过程中一些常用操作,现在要封装成模版,或者公用包,这样方便以后部署,项目想以后类似这样的操作,只要丢相关的几个参数进去就能解决问题,同时谢谢你的回复
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行