复制&使用%ROWTYPE修改Oracle记录

时间:2012-03-08 00:14:56

标签: oracle plsql

我现在没有权限来测试这个,但是以下是 - 或类似的东西,因为我的头顶代码可能不完美! - 可以在Oracle中使用:

declare
  myRecord myTable%ROWTYPE;
begin
  select * into myRecord from myTable where key = 123;
  myRecord.key   := 456;
  myRecord.value := myRecord.value + 50;
  insert into myTable select * from table(myRecord);
end;

即,我们将myTable中的记录(可能有100个字段)与密钥123复制到具有相同模式的变量中,然后更新一些复制记录的字段(例如,这里,一个新的将密钥和更新的value)插回原始表之前:有效地,在必要时复制原始记录并进行一些修改?

我知道还有其他方法可以做到这一点,但与我见过的其他内容相比,这看起来相当简洁......当然,如果它能起作用的话!

2 个答案:

答案 0 :(得分:3)

INSERT INTO myTable VALUES myRecord;

本网站上的一些很好的例子:http://psoug.org/reference/insert.html我想你不想做这样的事情,因为你有很多专栏?

INSERT INTO myTable
  SELECT 456, value+50, colx, coly
     FROM myTable
     WHERE key = 123;

答案 1 :(得分:3)

它实际上比你提出的语法更容易

设置表格和数据

CREATE TABLE foo( 
  col1 NUMBER,
  col2 VARCHAR2(100)
);

INSERT INTO foo( col1, col2 )
  VALUES( 1, 'Justin' );

用于选择,修改然后重新插入记录的PL / SQL块

declare
  l_foo_rec foo%rowtype;
begin
  select *
    into l_foo_rec
    from foo
   where col1 = 1;
  l_foo_rec.col2 := 'Michael';
  l_foo_rec.col1 := l_foo_rec.col1 + 1;
  insert into foo
    values l_foo_rec;
end;

当您运行它时,将在FOO

中生成此数据
  1* select * from foo
SQL> /

      COL1 COL2
---------- --------------------
         1 Justin
         2 Michael

当然,正如Glenn所指出的那样,通过从现有行中选择数据而不需要使用PL / SQL来编写插入新行的SQL语句通常会更有效。但是,根据逻辑的复杂程度,PL / SQL方法可能更容易调试和维护。