我想复制新员工ID的现有记录

时间:2018-04-10 08:04:05

标签: sql oracle sql-insert

我想为新员工复制现有员工记录。 EG。

如果我现在的员工详细信息是:

EmpID: 100
EmpDept: Accounts
EmpEndDate: 12-12-2018

因此,当我添加新员工时,我不想手动编写插入语句,我想要的只是一个程序,可以复制新员工的所有其他值。

3 个答案:

答案 0 :(得分:0)

一种方法是将最大EmpID增加1,以便保持行的唯一性 - 如果您想要多行,则使用CONNECT BY LOOP

INSERT INTO Employee (
    EmpID
    ,EmpDept
    ,EmpEndDate
    )
WITH m(max_id) AS (
        SELECT MAX(EmpID)
        FROM Employee
        )
SELECT max_id + LEVEL
    ,EmpDept
    ,EmpEndDate
FROM Employee
CROSS JOIN m
WHERE EmpID = p_emp_id CONNECT BY LEVEL <= p_numof_rows;

将此查询放入过程中,并将p_emp_idp_numof_rows作为参数传递,以根据需要复制任意数量的行。希望您通过的每个p_emp_id表中都有一行。

如果您总是想要一行,只需使用max_id + 1并删除CONNECT BY LEVEL <= p_numof_rows

即可

Demo

答案 1 :(得分:0)

假设您使用名为Employees__EmpID__Seq的序列生成唯一的员工ID,那么:

INSERT INTO Employees ( EmpID, EmpDept, EmpEndDate )
  SELECT Employees__EmpID__Seq.NEXTVAL,
         EmpDept,
         EmpEndDate
  FROM   Employees
  WHERE  EmpID = :id_of_the_employee_you_want_to_copy;

然后,您可以运行该语句,它将复制现有记录。

  

我想要的只是一个程序,可以复制新员工的所有其他值。

如果你真的需要将它包装在一个程序中:

CREATE PROCEDURE copy_employee(
  i_empid IN  Employees.EmpID%TYPE,
  o_empid OUT Employees.EmpID%TYPE
)
IS
BEGIN
  o_empid := Employees__EmpID__Seq.NEXTVAL;

  INSERT INTO Employees ( EmpID, EmpDept, EmpEndDate )
    SELECT o_empid,
           EmpDept,
           EmpEndDate
    FROM   Employees
    WHERE  EmpID = i_empid;

  IF SQL%ROWCOUNT <> 1 THEN
    o_empid := NULL;
  END IF;
END;
/

SQLFiddle

答案 2 :(得分:0)

您也可以在PL / SQL中执行此操作,

DECLARE
    v_emp_rec employee%ROWTYPE;
BEGIN
    SELECT *
      INTO v_emp_rec
      FROM employee
     WHERE emp_id = 'emp_id_to_replicate';

    v_emp_rec.emp_id := '101';
    v_emp_rec.first_name := 'Alfie';

    INSERT INTO employee
    VALUES
    v_emp_rec;


    v_emp_rec.emp_id := '102';
    v_emp_rec.first_name := 'Alf';

    INSERT INTO employee
    VALUES
    v_emp_rec;
END;
/


COMMIT;