declare
  -- UPDATE ... SET ROW for one row

  -- static SQL
  -- fails at 9.0.1 with PL/SQL: ORA-00904:
  -- invalid column name
  v_emprec employees%rowtype := Emp_Util.Get_One_Row;
begin

  v_emprec.salary := v_emprec.salary * 1.2;
  update employees_0
    set row = v_emprec
    where employee_id = v_emprec.employee_id;
end;
/

-- PL/SQL procedure successfully completed.
rollback /* prepare for repeat or for next sample */;
-- Rollback complete.






declare
  -- Of course this form works too
  -- and does so at 9.0.1 since the in-bind
  -- is not a RECORD
  v_emprec employees%rowtype := Emp_Util.Get_One_Row;
begin
  v_emprec.salary := v_emprec.salary * 1.2;

  update employees_0
    set
      first_name       = v_emprec.first_name,
      last_name        = v_emprec.last_name,
      email            = v_emprec.email,
      phone_number     = v_emprec.phone_number,
      hire_date        = v_emprec.hire_date,
      job_id           = v_emprec.job_id,
      salary           = v_emprec.salary,

      commission_pct   = v_emprec.commission_pct,
      manager_id       = v_emprec.manager_id,
      department_id    = v_emprec.department_id
    where employee_id  = v_emprec.employee_id;
end;
/
-- PL/SQL procedure successfully completed.
rollback /* prepare for repeat or for next sample */;
-- Rollback complete.






declare
  -- There's no syntax to in-bind a RECORD
  -- to an explicit column list
  --
  -- fails at 9.2.0 with PL/SQL: ORA-01767:
  -- UPDATE ... SET expression must be a subquery
  v_emprec employees%rowtype := Emp_Util.Get_One_Row;

begin
  v_emprec.salary := v_emprec.salary * 1.2;
  update employees_0
    set (
      first_name,
      last_name,
      email,
      phone_number,
      hire_date,
      job_id,
      salary,
      commission_pct,

      manager_id,
      department_id )
      = v_emprec
    where employee_id  = v_emprec.employee_id;
end;
/
-- PL/SQL procedure successfully completed.
rollback /* prepare for repeat or for next sample */;
-- Rollback complete.






declare
  -- When you use "SET ROW", the shape of the in-bind RECORD
  -- must be <the_table>%rowtype
  --
  -- fails at 9.2.0 with PL/SQL: ORA-00913:
  -- too many values
  v_emprec employees%rowtype := Emp_Util.Get_One_Row;

  cursor cur is
    select  last_name, email, hire_date, job_id, salary
      from employees;
  v_empsubrec cur%rowtype;
begin

  v_empsubrec.last_name := v_emprec.last_name;
  v_empsubrec.email     := v_emprec.email;
  v_empsubrec.hire_date := v_emprec.hire_date;
  v_empsubrec.job_id    := v_emprec.job_id;
  v_empsubrec.salary    := v_emprec.salary * 1.2;

  update employees_0
    set row = v_empsubrec
    where employee_id = v_emprec.employee_id;
end;
/
-- PL/SQL procedure successfully completed.
rollback /* prepare for repeat or for next sample */;
-- Rollback complete.