需求如下:
记录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;
/
|