问题描述
我有一个代码,可以删除工作超过 5 年的特定员工。我想一次性将这一声明应用于所有员工。
DECLARE
currentDate DATE := SYSDATE;
hireDate Date;
empId number := 100;
BEGIN
SELECT hire_date INTO hireDate FROM employees
WHERE employee_id = empId;
DELETE FROM emp
WHERE (currentDate-hireDate) / 365 > 5 AND employee_id = empId;
DBMS_OUTPUT.PUT_LINE(sql%rOWCOUNT || ' rows deleted.');
END;
如您所见,我将 empId 声明为 100。此员工的 currentDate-hireDate / 365 > 5
返回 4,这是错误的。我的桌子上有 107 名员工,从 100 到 206。如果我删除 WHERE employee_id = empId;
,它会返回太多行错误。你有什么可以推荐给我的吗?
解决方法
试试这个。
DATEDIFF(dd,hireDate,currentDate)/365.0
,
您可以将 MONTHS_BETWEEN()
函数与 TRUNC()
一起使用,而不需要 PL/SQL
,例如
DELETE emp
WHERE TRUNC( MONTHS_BETWEEN( current_date,hire_date ) / 12 ) >= 5
AND employee_id = 100
连同包括确切的 5 年差异,但我建议您宁愿使用软删除,例如
UPDATE emp
SET active = 0
WHERE TRUNC( MONTHS_BETWEEN( current_date,hire_date ) / 12 ) >= 5
AND employee_id = 100
AND active = 1
如果你还想用PL/SQL,那就用下面的代码
DECLARE
empId emp.employee_id%type := 100;
BEGIN
UPDATE emp
SET active = 0
WHERE TRUNC( MONTHS_BETWEEN( current_date,hire_date ) / 12 ) >= 5
AND employee_id = 100
AND active = 1;
DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT || ' rows deleted.');
END;
/
其中局部变量 currentDate
(使用 current_date
函数代替)、hireDate
和 SELECT
语句在当前情况下是多余的。