我想为新员工复制现有员工记录。 EG。
如果我现在的员工详细信息是:
EmpID: 100
EmpDept: Accounts
EmpEndDate: 12-12-2018
因此,当我添加新员工时,我不想手动编写插入语句,我想要的只是一个程序,可以复制新员工的所有其他值。
答案 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_id
和p_numof_rows
作为参数传递,以根据需要复制任意数量的行。希望您通过的每个p_emp_id
表中都有一行。
如果您总是想要一行,只需使用max_id + 1
并删除CONNECT BY LEVEL <= p_numof_rows
答案 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;
/
答案 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;