还望前辈们指教!在此感谢!!!
实现要求:
1:定期对上月到本月期间表A字段为1,2,3的数据与表B字段为1,2,3的数据进行比对。比较是以最新的记录为基准。
2:相反:用B表比对A表,如果有差异结果产生,则更新B表指定字段值。
---所谓比较以最新基准:
---例如:A表有显示小明记录已付款,但是表B上可能显示两条关于小明的记录,一个是退订,一个是一付款,则比较对象是----以最新记录'已付款'为准,则结果为记录相同。我大概写了小段,还不能达到功能要求:
crontab -e 设置执行时间  0 2 11 * * * /***/***/**.sh
---------PLSQL测试--------------------------
DECLARE
    v_ID         A.id%TYPE;
    v_lastname   A.lastname%TYPE;
    v_firstname  A.firstname%TYPE;    
    v_address    A.address%TYPE;        
    v_age        int;
    v_num1       int;
    v_num2       int;
    v_FLAG       int;   
    CURSOR c_testA IS select ID, LASTNAME, FIRSTNAME, ADDRESS from  A where A.age in(20,21,22);
    -----------应该有时间限制的,不知道怎么写.....悲剧。 
    CURSOR c_testB IS select ID, LASTNAME, FIRSTNAME, ADDRESS from  B where B.age in(20,21,22); 
--------计算表A_TEMP数量---------------------
--------我想创建临时表来存放从A取出的指定字段记录。
BEGIN
     select count(*) into v_num1 from user_tables where table_name='TestA_TEMP';
     if v_num1<1 then
    execute immediate 'CREATE GLOBAL TEMPORARY TABLE TestA_TEMP (
    v_Acol1 int,
    v_Acol2 varchar2,
    v_Acol3 varchar2,
    v_Acol4 varchar2,
    v_Acol5 int
    ) ON COMMIT PRESERVE ROWS';
    --end if;-------操作游标c_testA----------用游标将记录插入临时表中
  
     
     OPEN  c_testA;
     LOOP 
     FETCH c_testA INTO TestA_TEMP;
    
     --execute immediate 'insert into TestA_Temp values ('''||v_ID||''','''||v_lastname||'''
     -- ,'''||v_firstname||''','''||v_address||''','''||v_age||''')';
    
     EXIT WHEN c_testA % NOTFOUND;
     END LOOP;
    
--------临时表A_TEMP赋值------------------------
   --------计算表B_TEMP数量------------------------逻辑同上
   select count(*) into v_num2 from user_tables where table_name='TestB_TEMP';
   -- if v_num2<1 then
    execute immediate 'CREATE GLOBAL TEMPORARY TABLE TestB_TEMP (
    v_Bcol1 int,
    v_Bcol2 varchar2,
    v_Bcol3 varchar2,
    v_Bcol4 varchar2,
    v_Bcol5 int,
    ) ON COMMIT PRESERVE ROWS';
   -- end if;---------操作游标test_B -------------------------------
 OPEN  c_testB;
     LOOP 
     FETCH c_testB INTO TestB_TEMP;
     Dbms_output.put_line(TestB_TEMP.vBcol1);
     --execute immediate 'insert into TestB_TEMP values  ('''||v_ID||''','''||v_lastname||'''
     --,'''||v_firstname||''','''||v_address||''','''||v_age||''')';
    
     EXIT WHEN c_testB % NOTFOUND;
     END  LOOP;  -----------创建CompareResult表 ------------------存储临时表比对后的结果
execute immediate 'create table CompareResult
(
    ID         int;
    lastname   varchar;
    firstname  varchar;    
    address    varchar;        
    age        int
)';
--将两表不同字段值插入新表CompareResult
     execute immediate 'insert into CompareResult 
    VALUES( SELECT * FROM A_TEMP MINUS SELECT * FROM B_TEMP)';-----------判断差异结果------------------------
      if  (exsits(select * from B_TEMP MINUS select * from A_TEMP) )为真 执行下面更新。 
-----------更新值-----------------
      --execute immediate 'update dsmp.B age  =  '21'';
    --end if;
execute immediate 'drop table A_temp';
execute immediate 'drop table B_temp';
END;

解决方案 »

  1.   

    表A
    ID         integer    primary key
    lastname   varchar(30)
    firstname  varxhar(30)   
    address    varchar(120)     
    age        integer     要更新的字段
    donedate       data    最后一次操作时间  
    表B结构字段结构/类型与表B一样。表示内容一样,只是字段名略有不同而已。
      
      

  2.   

    为什么要这么实现,直接用触发器不就好了?另外,如果没有特殊的地方,建议,直接用 B表,覆盖 A表数据。
    即 delete + insert 就好了嘛。
      

  3.   


    楼主考虑下   intersect 和 minus