还望前辈们指教!在此感谢!!!
实现要求:
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字段为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;
ID integer primary key
lastname varchar(30)
firstname varxhar(30)
address varchar(120)
age integer 要更新的字段
donedate data 最后一次操作时间
表B结构字段结构/类型与表B一样。表示内容一样,只是字段名略有不同而已。
即 delete + insert 就好了嘛。
楼主考虑下 intersect 和 minus