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中已有的行。否,对于唯一事务,我的意思是我希望一次处理一条记录。处理它,复制行并删除它。许多小交易。这不是一个大问题,因为它可能与你的代码(加入)。你为什么要这样做?由于所有额外的、不必要的上下文切换,记录越多,性能下降的速度就会更快。它们是行级触发器吗?因为如果是这样的话,你就没有什么办法让它们更快了,因为它们会立即将流程变成一行一行的流程。在我看来,你真的应该看看整个问题,而不是只看问题的一小部分,然后再加以润色。如果您可以更新您的问题以包含所有内容的测试用例(您的表、触发器、输入数据、预期输出数据等),那么我们可能会建议一个更好的解决方案,完全避免触发器。