更新记录类型为

时间:2016-08-30 07:28:59

标签: oracle plsql

我有一张表EMPLOYEREMPLOYER_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;

我可以在一个语句中更新带有记录类型对象的行吗?正如上面的例子所示。

3 个答案:

答案 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;
/