在同一个数据库,两个字段相同的表a1、a2。a1软件系统使用,a2用于备份a1里的数据,如何建一个存储过程比较a1和a2里的数据,把a1变化的数据记录作为结果返回给调用的jsp程序,然后再更新a2所有数据记录和a1的所有数据一样??
  新手上路!如果解决马上结贴,如果你认为不够可以再加!!
   谢谢,帮助我!!

解决方案 »

  1.   

    补充一下,a1、a2的字段如下:
        id number(8) not null
        compname varchar2(20) not null
        compcode varchar2(50) not null
        chapter  varchar2(50) not null
        compnumber number(8)  not null
        dealdate  date  not null
      

  2.   

    一开始就在a1表上建个触发器,当a1更改的时候,也同时更改a2表。
      

  3.   

    create or replace trigger xxx
    before insert on a1 for each row
    begin
     .....
    end;
    ....
      

  4.   

    http://expert.csdn.net/Expert/topic/1567/1567099.xml?temp=.6762659
      

  5.   

    create trigger name_tri
    before insert or update on a1
    for each row
    begin
    if insertint then
    ...
    else
    ...
    end if;
    end;
    /
      

  6.   

    对不起,忘记了说了,a1、a2中字段id是唯一键。
      用触发器也可以只要能实现,不过我还要把比较的差异写到文件里?
      谢谢,最好具体一点,我是新手!!
      

  7.   

    你用触发器来保持数据一致,然后用utl_file包写入文件中
      

  8.   

    create or replace trigger t_a1
    after insert or update on a1
    for each row
    begin
     delete a2 where id=:new.id;
     insert into a2 values(:new.id,:new.fields......);
    end t_a1;
      

  9.   

    特别感谢大家(   hrb_qiuyb(大森林) 、beckhambobo(beckham)、maohaisheng、nicholaz(九思·逢尤) 、ropriest(馆主)、 ww_xiaohua(蓝天)等)
       用触发器解决了a1和a2数据的同步,但怎样完成比较a1和a2里的数据,把a1变化的数据写到一个文件里(只把数据变化的记录,包括删除的、更新的、新插入写到一个xml或其他格式文件里)
       对不起麻烦大家了,我刚刚接触,我会好好学的!
       一旦可以马上揭贴,决不食言!
       再次谢谢大家的热心帮助和关心!!
      

  10.   

    总结陈词:
    其实这个问题太麻烦了,利用点业余时间还是把它搞定吧
    1、你首先需在init<sid>.ora中加入一个参数utl_file_dir
      eg:utl_file_dir = c:\
      把库重启一下
    2、我这里写了一个存储过程用于把变动的数据输出到文件文件,过程名为put_str_to_file
     同时写一个trigger,这是借鉴maohaisheng()的.具体内容如下:  --用于把字符串输出到文件
    CREATE OR REPLACE PROCEDURE put_str_to_file(str_in VARCHAR2)
    IS
      FILE_HANDLE UTL_FILE.FILE_TYPE;
    BEGIN
       FILE_HANDLE:=UTL_FILE.FOPEN('C:\','TEST.TXT','A');
       UTL_FILE.PUT_LINE(FILE_HANDLE,str_in);
       UTL_FILE.FCLOSE(FILE_HANDLE);
    END;CREATE OR REPLACE TRIGGER tr_bf_test
     BEFORE INSERT OR UPDATE OR DELETE OF ID ON a1 
     FOR EACH ROW
     BEGIN
       IF INSERTING THEN
         INSERT INTO a2
         VALUES(:new.id,:new.compname,:new.compcode,:new.chapter,:new.compnumber,:new.dealdate);
       ELSIF UPDATING THEN
         UPDATE a2 SET id=:new.ID,
                          compname=:new.compname,
                          compcode=:new.compcode,
                          chapter=:new.chapter,
                          compnumber=:new.compnumber,
                          dealdate=:new.dealdate
         WHERE ID = :old.ID;
       ELSE 
         DELETE FROM a2
         WHERE ID = :old.ID;
       END IF;
       put_str_to_file('变动的id是:'||:old.id);
     END tr_bf_TTRIG;3、程序还有些粗糙,你修整一个,我只是搭个架子。
      

  11.   

    hrb_qiuyb(大森林) :
      您好!我是已system/manager用户登入系统的,建立了表a1、a2和触发器、存储过程(put_str_to_file),当向a1里插入新记录时:
       提示如下

    ERROR 位于第 1 行:
    ORA-06510: PL/SQL: 无法处理的用户自定义异常事件
    ORA-06512: 在"SYS.UTL_FILE", line 98
    ORA-06512: 在"SYS.UTL_FILE", line 157
    ORA-06512: 在"SYSTEM.PUT_STR_TO_FILE", line 5
    ORA-06512: 在"SYSTEM.TR_BF_TEST", line 17
    ORA-04088: 触发器 'SYSTEM.TR_BF_TEST' 执行过程中出错”
      

  12.   

    hrb_qiuyb(大森林):
        您好:
        我遇到的情况和“itfuture(远景) ”一样也是“
       ERROR 位于第 1 行:
    ORA-06510: PL/SQL: 无法处理的用户自定义异常事件
    ORA-06512: 在"SYS.UTL_FILE", line 98
    ORA-06512: 在"SYS.UTL_FILE", line 157
    ORA-06512: 在"SYSTEM.PUT_STR_TO_FILE", line 5
    ORA-06512: 在"SYSTEM.TR_BF_TEST", line 17
    ORA-04088: 触发器 'SYSTEM.TR_BF_TEST' 执行过程中出错”
      这样的提示!!
      

  13.   

    感谢hrb_qiuyb(大森林)的热心帮助:
     “  1、你首先需在init<sid>.ora中加入一个参数utl_file_dir
      eg:utl_file_dir = c:\”
      中的“eg:utl_file_dir = c:\”,应该是“utl_file_dir = c:\”吧!
      马上结贴!!