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;
展开
 我来答
殇忄路
2014-11-10 · TA获得超过560个赞
知道小有建树答主
回答量:478
采纳率:81%
帮助的人:329万
展开全部
--向 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;
最简单的方法,就是这样了
LMLU23
2014-11-10 · TA获得超过901个赞
知道小有建树答主
回答量:373
采纳率:0%
帮助的人:365万
展开全部

问题是什么?编译出错?执行有问题?

从你贴出来的代码里可以看到比较多错误:

  1. commit实际上可以放到if...else外面,这样简洁点。

  2. 每次都commit效率会很慢,建议是每200-1000commit一次。用一个计数器就行了。

  3. 这个感觉上是批量处理,应该对每一条记录捕获下异常,异常信息应该输出或者记录到另外一个表中,不然出了错就停下来,又不知道停在哪里...

  4. Cursor打开了没有关闭。

  5. 逻辑好像也不太对啊,第一条select语句应该放在FOR END LOOP里面,然后应该加上where t.id = c_row.id

  6. 每次都select一次效率不高,可以用两个游标来处理的。两个游标各自按照相同的顺序从A、B表中select出来数据,接下来就是挨个往下比就行了。

更多追问追答
追问
执行提示ORA-01422实际返回的行数超出请求的行数;

能帮我改改代码吗,这个存储过程实际上是实现从SQL Server取过来的数据同步到Oracle,sql中新增的Oracle也要新增,sql有修改的Oracle也要跟着修改。。
追答
就是你那个select的语句没有where条件,select into 要求查询结果只能有唯一一条,否则就会报这个错
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式