具有不同值的同一表中的重复字段

时间:2016-12-21 10:27:25

标签: database oracle plsql cursor

我试图创建一个存储过程,允许我在同一个表上复制一些特定的元组但具有不同的值。我已经有一个存储过程,允许我创建一个包含所有字段的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'在将它重新复制到同一个表之前,我怎么能用游标呢?

enter image description here

1 个答案:

答案 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表定义的硬光标。如果您正在编写包裹,请执行此操作。
  • 我在内循环中对变换进行了硬编码。这是一个巨大的欺骗。可能你需要为更新实现许多复杂的规则。
  • 我忽略了ID的更新。您需要处理(除非它在触发器中自动完成)