我试图创建一个存储过程,允许我在同一个表上复制一些特定的元组但具有不同的值。我已经有一个存储过程,允许我创建一个包含所有字段的SOCIETE表元组:
FUNCTION createPerson(P_ID_SOCIETE_PERE SOCIETE.ID_SOCIETE_PERE%TYPE
, P_SOURCE_SOCIETE_PERE SOCIETE.SOURCE_SOCIETE_PERE%TYPE
,......)
现在我必须用它来复制同一桌子上的人,只改变一个字段,例如" field3 =' N' "满足此条件的地方:
select s.ID_SOCIETE , s.SOURCE_SOCIETE
, s.RAISON_SOCIALE
from FACTURE f, SOCIETE s, partenaire p
where s.ID_SOCIETE = f.SOC_ID and s.SOURCE_SOCIETE = f.SOC_SOURCE
and p.ID_SOCIETE = f.SOC_ID
group by s.SOURCE_SOCIETE , s.SOURCE_SOCIETE
, s.RAISON_SOCIALE ;
为此,我被告知要使用Oracle PL / SQL游标。有人有一个简单的例子可以关注吗? 如果我想我需要复制大于490的所有ID,请将SOURCE_SOCIETE更改为' B'而不是' A'在将它重新复制到同一个表之前,我怎么能用游标呢?
答案 0 :(得分:0)
“我被告知我需要使用Oracle Cursor存储过程”
嗯,你总是可以问那个告诉你的人,而不是互联网上的一群陌生人,但无论如何..
以下是我认为他们想到的事情。 (未经测试的代码,请注意语法错误和错误)。
create or replace procedure duplicate_records
( p_in_recs in sys_refcursor
, p_rec_count out pls_integer )
is
type SOCIETE_array is table of SOCIETE%rowtype;
dup_recs SOCIETE_array;
dup_count simple_integer := 0;
begin
loop
fetch p_in_recs bulk collect into dup_recs limit 100;
exit when dup_recs.count() = 0;
for idx in 1..dup_recs.count() loop
dup_recs(idx).SOURCE_SOCIETE = 'B';
-- dup_recs(idx).ID := ?????
end loop;
forall j in 1..dup_recs.count()
insert into SOCIETE
values dup_recs(j);
dup_count := dup_count + sql%rowcount;
end loop;
p_rec_count := dup_count;
end;
/
你会这样称呼:
declare
n pls_integer;
begin
duplicate_records ( cursor (select * from societe where id > 490 )
, n );
end ;
/
几点需要注意:
p_in_recs
声明为针对SOCIETE表定义的硬光标。如果您正在编写包裹,请执行此操作。