Oracle:在更新具有多列的表的一个字段时复制行

Posted

技术标签:

【中文标题】Oracle:在更新具有多列的表的一个字段时复制行【英文标题】:Oracle: copy row while updating one field for table with many columns 【发布时间】:2015-02-02 13:20:03 【问题描述】:

有没有一种方法可以通用地复制一行,特别是不指定所有列。

在我的情况下,我有一个大表,我想复制除 ID 和另一列之外的所有列。事实上,数据是在年初时逐年复制的。该表有 50 多个列,因此如果我不必指定所有列,那么更改架构会更加灵活和健壮。

这与问题密切相关:copy row while updating one field

在那个问题中,Kevin Cline 的评论本质上是在问我的问题,但实际上并没有为这种更一般的情况提供解决方案。

根据要求编辑以提供更多详细信息,以下是所需内容的示例:

-- setup test table
create table my_table(pk, v1,v2,v3,v4 ... v50) as
  select 17 pk, 1 v1,2 v2,3 v3... 50 v50 from dual;

在上表中复制该行并将 pk 设置为 18,将 v2 设置为 10。

【问题讨论】:

如果我正确理解了这个问题,创建一个包含所需列的视图不是一种解决方案,然后您可以根据该视图中的所有值更新/创建记录吗?您能否提供一个确切的示例来说明您想要做什么(即使它会导致错误),以便可以根据实际问题考虑解决方案? 我认为你的建议会奏效,我更喜欢 Frank 的回答,因为我对视图没有其他用途。 我现在明白了。 Frank 对 ROWTYPE 的使用看起来确实不错。但我会更改/添加:使过程/函数允许主键值作为参数。 【参考方案1】:

一个简单的方法是匿名PL/SQL块和ROWTYPE的用法:

-- setup test table
create table my_table(pk, value) as
  select 17 pk, 'abc' value from dual;

declare
  l_data my_table%rowtype;
begin
  -- fetch the row we want to copy
  select * into l_data from my_table tbl where tbl.pk = 17; 
  -- update all fields that need to change
  l_data.pk := 18;
  -- note the lack of parens around l_data in the next line
  insert into my_table values l_data; 
end;

【讨论】:

以上是关于Oracle:在更新具有多列的表的一个字段时复制行的主要内容,如果未能解决你的问题,请参考以下文章

oracle的表更新问题

SQL间的两个数据库表的同步更新

在 PLSQL 中,如何迭代更新一个非常大的表的字段?

oracle怎么用一个表的多个字段数据更新另一个表相应的字段中

Oracle 批量修改某个用户下表的表空间

Oracle 更新非索引和非分区表的有效方法?