Oracle存储过程的更新插入问题。
一个存储过程,要实现的是数据同步。要求对比两张表A和B,id相同A有做修改的B也要更新,A中新增的B也要跟着更新。附代码createorreplaceprocedureS...
一个存储过程,要实现的是数据同步。要求对比两张表A和B,id相同A有做修改的B也要更新,A中新增的B也要跟着更新。附代码
create or replace procedure SQL2ORA is
v_id number;
v_names varchar(50);
cursor c_test is
select id,name from test@sqllink;
c_row c_test%rowtype;
begin
select t.id ,t.name into v_id,v_names FROM testsql t;
FOR c_row IN c_test LOOP
if(c_row.id=v_id) then
update testsql t set t.name=c_row.name;
commit;
else
insert into testsql(id,name) values ( c_row.id,c_row.name);
commit;
end if;
END LOOP;
end SQL2ORA; 展开
create or replace procedure SQL2ORA is
v_id number;
v_names varchar(50);
cursor c_test is
select id,name from test@sqllink;
c_row c_test%rowtype;
begin
select t.id ,t.name into v_id,v_names FROM testsql t;
FOR c_row IN c_test LOOP
if(c_row.id=v_id) then
update testsql t set t.name=c_row.name;
commit;
else
insert into testsql(id,name) values ( c_row.id,c_row.name);
commit;
end if;
END LOOP;
end SQL2ORA; 展开
2个回答
展开全部
--向 TESTSQL 插入 TESTSQL 不存在的数据
INSERT INTO TESTSQL
(ID, NAME)
SELECT ID, NAME
FROM TEST@SQLLINK AA
WHERE NOT EXISTS (SELECT ID FROM TESTSQL BB WHERE BB.ID = AA.ID);
--修改 TESTSQL
UPDATE TESTSQL AA
SET AA.NAME =
(SELECT BB.NAME FROM TEST@SQLLINK BB WHERE BB.ID = AA.ID);
我觉得有点没必要写存储过程,上面两条sql完全可以实现你的需求,如果非要写成存储过程,按照上面两条sql改写就可以了
更多追问追答
追问
所给是能实现,由于需要定时更新要用到JOB调度所以写了存储过程(上述是测试表)新手求罩啊,存储过程很少写到不太熟
追答
最简单的方法,就是这样了
CREATE OR REPLACE PROCEDURE SQL2ORA IS
BEGIN
--修改 TESTSQL
UPDATE TESTSQL AA
SET AA.NAME =
(SELECT BB.NAME FROM TEST@SQLLINK BB WHERE BB.ID = AA.ID);
COMMIT;
--向 TESTSQL 插入 TESTSQL 不存在的数据
INSERT INTO TESTSQL
(ID, NAME)
SELECT ID, NAME
FROM TEST@SQLLINK AA
WHERE NOT EXISTS (SELECT ID FROM TESTSQL BB WHERE BB.ID = AA.ID);
COMMIT;
END SQL2ORA;
展开全部
问题是什么?编译出错?执行有问题?
从你贴出来的代码里可以看到比较多错误:
commit实际上可以放到if...else外面,这样简洁点。
每次都commit效率会很慢,建议是每200-1000commit一次。用一个计数器就行了。
这个感觉上是批量处理,应该对每一条记录捕获下异常,异常信息应该输出或者记录到另外一个表中,不然出了错就停下来,又不知道停在哪里...
Cursor打开了没有关闭。
逻辑好像也不太对啊,第一条select语句应该放在FOR END LOOP里面,然后应该加上where t.id = c_row.id
每次都select一次效率不高,可以用两个游标来处理的。两个游标各自按照相同的顺序从A、B表中select出来数据,接下来就是挨个往下比就行了。
更多追问追答
追问
执行提示ORA-01422实际返回的行数超出请求的行数;
能帮我改改代码吗,这个存储过程实际上是实现从SQL Server取过来的数据同步到Oracle,sql中新增的Oracle也要新增,sql有修改的Oracle也要跟着修改。。
追答
就是你那个select的语句没有where条件,select into 要求查询结果只能有唯一一条,否则就会报这个错
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询