我有一张表EMPLOYER
,EMPLOYER_ID
作为主键。我编写以下脚本来更新表中的行:
declare
emp_row EMPLOYER%ROWTYPE;
begin
select * into emp_row from EMPLOYER where rownum <= 1;
emp_row.NAME := 'ABC';
emp_row.AGE := 99;
-- Can I write something like below?
update EMPLOYER set ??? = emp_row where EMPLOYER_ID = emp_row.EMPLOYER_ID;
end;
我可以在一个语句中更新带有记录类型对象的行吗?正如上面的例子所示。
答案 0 :(得分:2)
请尝试这样的事情
update EMPLOYER set ROW = emp_row where EMPLOYER_ID = emp_row.EMPLOYER_ID;
请记住:此UPDATE设置表中每列的值,包括主键,因此您应该非常小心地使用SET ROW语法。
答案 1 :(得分:2)
是的,你可以:
declare
emp_row EMPLOYER%ROWTYPE;
begin
select * into emp_row from EMPLOYER where rownum <= 1;
emp_row.NAME := 'ABC';
emp_row.AGE := 99;
update EMPLOYER e set row = emp_row
where e.EMPLOYER_ID = emp_row.EMPLOYER_ID;
end;
但是,请注意,这将尝试更新行中的每个列,包括主键。此外,如果您的表获得虚拟列,则会失败。
答案 2 :(得分:0)
回答你的问题:
您需要更新每个列,例如:ColumnA = recordName.ColumnA
,您不能一次插入整行。
给你一个建议:
我认为SELECT INTO
有点危险,因为如果你的表为空,你会尝试插入一个NULL值,这将导致以下错误:ORA-01403: no data found
。
在较大的项目中,这个错误很难找到。
也许这个例子会给你一个想法:
在这里,我使用游标从表中获取行。
因为我没有遍历它们,所以只找到找到的第一条记录并存储在rEmployer
中。
所以rEmpoyer
包含来自该表的第一个rownumber的所有数据。
我使用布尔值来检查是否找到了一些数据,如果我们这样做,我们将它放在TRUE
上。
之后我们更新表格。
DECLARE
CURSOR cEmployer IS
SELECT *
FROM Employer;
rEmployer cEmployer%ROWTYPE;
fFound BOOLEAN := FALSE;
BEGIN
-- By not using a loop, only the first record is taken.
OPEN cEmployer;
FETCH cEmployer INTO rEmployer;
IF cEmployer%FOUND THEN
-- There is a row in the table 'Employer'.
fFound := TRUE;
END IF;
CLOSE cTemp;
-- Modify some values and add update the row:
IF fFound THEN
-- MOdify some values.
rEmployer.Name := 'ABC';
rEmployer.Age := '99';
-- Update the table.
UPDATE Employer
SET Name = rEmployer.Name,
Age = rEmployer.Age
WHERE EmployerId = rEmployer.EmployerId;
COMMIT;
END IF;
END;
/