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

Posted

技术标签:

【中文标题】同一表中具有不同值的重复字段【英文标题】:Duplicate fields in the same table with different values 【发布时间】:2016-12-21 10:27:24 【问题描述】:

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

【问题讨论】:

请发布一些示例数据和所需的结果以澄清您的问题 你不能只选择需要相同的列并对需要更改的列进行硬编码并将其提供给插入吗? 问题是有很多真正的元组数据,我被告知我需要使用 Oracle Cursor 使用存储过程... 这也很好。提出查询,使用BULK COLLECTBULK COLLECT以批量的形式定义游标和处理游标输出 @GurwinderSingh 感谢您的评论,但我正在尝试做一些不同的事情,我正在尝试获取我进入函数参数的所有字段,所以它可以直接插入并自动生成 ID,例如:FETCH CURSOR INTO exec myProcedure(.." here"...) 【参考方案1】:

“有人告诉我我需要使用 Oracle 游标通过存储过程来执行此操作”

好吧,你总是可以问告诉你的人,而不是互联网上的一群陌生人,但无论如何..

这就是我认为他们的想法。 (未经测试的代码,因此请注意语法错误和错误)。

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 的更新。你需要处理它(除非它在触发器中自动完成

【讨论】:

以上是关于同一表中具有不同值的重复字段的主要内容,如果未能解决你的问题,请参考以下文章

如何从两个表中选择同一字段中具有相同值的行?

猫鼬查询具有不同值的相同字段

SQL,仅结合两个具有不同值的表(仅基于三个字段,而不是整行)

如果具有指定值的同一表中存在重复键,则 MYSQL DELETE 行

SQL:查找给定字段连续几天具有不同字符串值的记录

Access 2016中如何使用表单填写同一张表中相同值的字段?