declare -- INSERT one row -- static SQL -- fails at 9.0.1 with ORA-00906: -- missing left parenthesis v_emprec employees%rowtype := Emp_Util.Get_One_Row; begin Emp_Util.Initialize_Count ( 'employees_2' ); insert into employees_2 values v_emprec; Emp_Util.Show_Count_Change; end; / -- PL/SQL procedure successfully completed. rollback /* prepare for repeat or for next sample */; -- Rollback complete. declare -- Note: YOU CAN'T BIND AN EXPLICIT COLUMN LIST TO A RECDORD -- -- fails at 9.2.0 with PL/SQL: ORA-00947: -- not enough values v_emprec employees%rowtype := Emp_Util.Get_One_Row; begin insert into employees_2 ( employee_id, first_name, last_name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id ) values v_emprec; end; / -- PL/SQL procedure successfully completed. rollback /* prepare for repeat or for next sample */; -- Rollback complete. begin -- Note: YOU CAN'T USE A FUNCTION RETURNING A RECORD AS A BIND -- -- fails at 9.2.0 with PL/SQL: ORA-00904: invalid column name insert into employees_2 values Emp_Util.Get_One_Row(); end; / -- ERROR at line N: rollback /* prepare for repeat or for next sample */; -- Rollback complete. declare -- INSERT many rows, single row syntax -- static SQL -- fails at 9.0.1 with ORA-00906: -- missing left parenthesis -- -- Actaully, this illustrates no more than the "INSERT one row" case -- there's no DML analogy to the different is SELECT -- between an implicit one-row cursor and a cursor loop v_emprecs Emp_Util.emprec_tab_t := Emp_Util.Get_Many_Rows; begin Emp_Util.Initialize_Count ( 'employees_2' ); for j in v_emprecs.First..v_emprecs.Last loop v_emprecs(j).salary := v_emprecs(j).salary * 1.1 /* add realism */; insert into employees_2 values v_emprecs(j); end loop; Emp_Util.Show_Count_Change; end; / -- PL/SQL procedure successfully completed. rollback /* prepare for repeat or for next sample */; -- Rollback complete.