我现在没有权限来测试这个,但是以下是 - 或类似的东西,因为我的头顶代码可能不完美! - 可以在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
)插回原始表之前:有效地,在必要时复制原始记录并进行一些修改?
我知道还有其他方法可以做到这一点,但与我见过的其他内容相比,这看起来相当简洁......当然,如果它能起作用的话!
答案 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方法可能更容易调试和维护。