gpt4 book ai didi

sql - 在 oracle 中使用游标插入和更新记录

转载 作者:行者123 更新时间:2023-12-04 20:55:56 26 4
gpt4 key购买 nike

我有 2 张 table - studentstudLoad都有 2 个字段 studIDstudName .我想从 student 加载数据表成stuLoad table 。
如果数据已经存在于studLoad表,那么它应该被更新,否则它应该被插入。以下是我的代码:

    create or replace procedure studentLoad is
v_id student.studID%type;
v_name student.studName%type;
v_sn studLoad.studName%type;
cursor cur_load is
select * from student;


begin
open cur_load;
loop
fetch cur_load into v_id,v_name;

exit when cur_load%notfound;
select studName into v_sn from studLoad where studID = v_id;
if(v_sn!= v_name) then
update studLoad set studName= v_name where studID= v_id;
else
insert into studLoad values(v_id,v_name);
dbms_output.put_line(v_id || ' ' || v_name);
end if;
end loop;
close cur_load;
end;

它不工作。不更新studLoad 表中的行。我该如何解决这个问题?在 SQL 服务器中,我们使用 IF EXISTS(select...from stuLoad..)检查表中是否存在记录,有没有办法在 Oracle 中做同样的事情?如果是,那么请让我知道同样的。

最佳答案

这是一种非常低效的方法。您可以使用 merge 语句,然后就不需要游标、循环或(如果可以的话)PL/SQL。

MERGE INTO studLoad l
USING ( SELECT studId, studName FROM student ) s
ON (l.studId = s.studId)
WHEN MATCHED THEN
UPDATE SET l.studName = s.studName
WHERE l.studName != s.studName
WHEN NOT MATCHED THEN
INSERT (l.studID, l.studName)
VALUES (s.studId, s.studName)

确保您 commit ,一旦完成,才能在数据库中看到这个。

要真正回答你的问题,我会做如下的事情。这样做的好处是可以在 SQL 中完成大部分工作,并且仅根据 rowid(表中的唯一地址)进行更新。

它声明了一种类型,您可以将数据批量放入其中,一次 10,000 行。然后分别处理这些行。

但是,正如我所说,这不会像 merge 那样有效。 .
declare

cursor c_data is
select b.rowid as rid, a.studId, a.studName
from student a
left outer join studLoad b
on a.studId = b.studId
and a.studName <> b.studName
;

type t__data is table of c_data%rowtype index by binary_integer;
t_data t__data;

begin

open c_data;
loop
fetch c_data bulk collect into t_data limit 10000;

exit when t_data.count = 0;

for idx in t_data.first .. t_data.last loop
if t_data(idx).rid is null then
insert into studLoad (studId, studName)
values (t_data(idx).studId, t_data(idx).studName);
else
update studLoad
set studName = t_data(idx).studName
where rowid = t_data(idx).rid
;
end if;
end loop;

end loop;
close c_data;

end;
/

关于sql - 在 oracle 中使用游标插入和更新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11921889/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com