Plsql Oracle PL/SQL复制行

Plsql Oracle PL/SQL复制行,plsql,Plsql,假设我得到了一个表a,其中包含以下列: colA,colB,colC 我想迭代此表上的记录,并将它们复制到一个新的表B(已存在于数据库中),其中包含以下列: 可乐、可乐、可乐、机器 但是表A中的每个记录都应该在表B中复制,复制的行数应该是表机器中的行数的倍(只有1列:名称) 在我看来,我可以将机器存储到一个字符串集合中,并使用循环对表a上的记录进行迭代 在缓存的MACHINES中的每次迭代中,我循环一次,在表B中写入一行,填充MACHINE字段,最后我删除表a中的当前行,这样它就不会被再次处理

假设我得到了一个
a
,其中包含以下列:
colA,colB,colC

我想迭代此表上的记录,并将它们复制到一个新的
B
(已存在于数据库中),其中包含以下列:
可乐、可乐、可乐、机器

但是
A
中的每个记录都应该在
B
中复制,复制的行数应该是表
机器
中的行数的倍(只有1列:
名称

在我看来,我可以将
机器
存储到一个字符串集合中,并使用循环对
a
上的记录进行迭代
在缓存的
MACHINES
中的每次迭代中,我循环一次,在
B
中写入一行,填充
MACHINE
字段,最后我删除
a
中的当前行,这样它就不会被再次处理

完成这项任务的最佳方式是什么?

这不简单吗:

with machines as (select 'A' name from dual union all
                  select 'B' name from dual union all
                  select 'C' name from dual),
       tablea as (select 1 col1, 1 col2, 1 col3 from dual union all
                  select 2 col1, 2 col2, 2 col3 from dual union all
                  select 3 col1, 3 col2, 3 col3 from dual union all
                  select 4 col1, 4 col2, 4 col3 from dual union all
                  select 5 col1, 5 col2, 5 col3 from dual)
-- end of mimicking tables tablea and machines
select ta.col1,
       ta.col2,
       ta.col3,
       m.name
from   tablea ta
       cross join machines m;

      COL1       COL2       COL3 NAME
---------- ---------- ---------- ----
         1          1          1 A   
         2          2          2 A   
         3          3          3 A   
         4          4          4 A   
         5          5          5 A   
         1          1          1 B   
         2          2          2 B   
         3          3          3 B   
         4          4          4 B   
         5          5          5 B   
         1          1          1 C   
         2          2          2 C   
         3          3          3 C   
         4          4          4 C   
         5          5          5 C   
?

然后您可以从表A中删除,类似于:

delete from tablea ta
where exists (select null
              from   tableb tb
              where  ta.col1 = tb.col1
              and    ta.col2 = tb.col2
              and    ta.col3 = tb.col3);
这不简单吗:

with machines as (select 'A' name from dual union all
                  select 'B' name from dual union all
                  select 'C' name from dual),
       tablea as (select 1 col1, 1 col2, 1 col3 from dual union all
                  select 2 col1, 2 col2, 2 col3 from dual union all
                  select 3 col1, 3 col2, 3 col3 from dual union all
                  select 4 col1, 4 col2, 4 col3 from dual union all
                  select 5 col1, 5 col2, 5 col3 from dual)
-- end of mimicking tables tablea and machines
select ta.col1,
       ta.col2,
       ta.col3,
       m.name
from   tablea ta
       cross join machines m;

      COL1       COL2       COL3 NAME
---------- ---------- ---------- ----
         1          1          1 A   
         2          2          2 A   
         3          3          3 A   
         4          4          4 A   
         5          5          5 A   
         1          1          1 B   
         2          2          2 B   
         3          3          3 B   
         4          4          4 B   
         5          5          5 B   
         1          1          1 C   
         2          2          2 C   
         3          3          3 C   
         4          4          4 C   
         5          5          5 C   
?

然后您可以从表A中删除,类似于:

delete from tablea ta
where exists (select null
              from   tableb tb
              where  ta.col1 = tb.col1
              and    ta.col2 = tb.col2
              and    ta.col3 = tb.col3);

实现行复制的最佳方法是如Boneist所述,直接使用SQL集

这根本不是像您打算做的那样在循环中迭代和执行的好方法。特别是像你这样的简单问题


PLSQL不能用来模仿Oracle在大多数情况下(远)比您使用循环做得更好的做法。

实现行复制的最佳方法是如Boneist所述,直接使用SQL集

这根本不是像您打算做的那样在循环中迭代和执行的好方法。特别是像你这样的简单问题


PLSQL不能用来模仿Oracle在大多数情况下(远)比您在循环方面做得更好。

这是一个很好的答案,但不是我要搜索的,因为我确实需要一个迭代器来避免唯一的事务。现在我有了一个迭代器,我不想每次都读取机器上的表,为了使过程更快,我更愿意以某种方式缓存它们。“为了避免唯一事务”,你的意思是避免添加重复行(因为唯一约束)?如果是这样,只需添加一个where子句来排除表B中已有的行。否,对于唯一事务,我的意思是我希望一次处理一条记录。处理它,复制行并删除它。许多小交易。这不是一个大问题,因为它可能与你的代码(加入)。你为什么要这样做?由于所有额外的、不必要的上下文切换,记录越多,性能下降的速度就会更快。它们是行级触发器吗?因为如果是这样的话,你就没有什么办法让它们更快了,因为它们会立即将流程变成一行一行的流程。在我看来,你真的应该看看整个问题,而不是只看问题的一小部分,然后再加以润色。如果您可以更新您的问题以包含所有内容的测试用例(您的表、触发器、输入数据、预期输出数据等),也许我们可以建议一个更好的解决方案,完全避免触发器。这是一个很好的答案,但不是我要搜索的,因为我确实需要一个迭代器来避免唯一的事务。现在我有了一个迭代器,我不想每次都读取机器上的表,为了使过程更快,我更愿意以某种方式缓存它们。“为了避免唯一事务”,你的意思是避免添加重复行(因为唯一约束)?如果是这样,只需添加一个where子句来排除表B中已有的行。否,对于唯一事务,我的意思是我希望一次处理一条记录。处理它,复制行并删除它。许多小交易。这不是一个大问题,因为它可能与你的代码(加入)。你为什么要这样做?由于所有额外的、不必要的上下文切换,记录越多,性能下降的速度就会更快。它们是行级触发器吗?因为如果是这样的话,你就没有什么办法让它们更快了,因为它们会立即将流程变成一行一行的流程。在我看来,你真的应该看看整个问题,而不是只看问题的一小部分,然后再加以润色。如果您可以更新您的问题以包含所有内容的测试用例(您的表、触发器、输入数据、预期输出数据等),那么我们可能会建议一个更好的解决方案,完全避免触发器。