[英]how to use not in condition in case statement in where clause
[英]How Can I use Case clause within WHERE condition in this procedure?
我正在编写一个简单的存储过程来检索有关所有员工的信息,但是,如果为参数传递了参数,我将添加2个参数以仅检索一位员工的信息。 我的意图是使用参数在WHERE中创建一个游标并添加条件,但目前不起作用。 你有什么主意吗? 谢谢!
程序是:
CREATE OR REPLACE PROCEDURE test6(
p_empid empleados.legajo%TYPE := NULL,
p_raise_salary empleados.sueldo_basico%TYPE := NULL)
IS
CURSOR c_emps
IS
SELECT legajo, apellido, nombre, fecha_alta, sueldo_basico,
(CASE
WHEN p_raise_salary IS NOT NULL THEN
sueldo_basico * p_raise_salary
ELSE
sueldo_Basico
END) aumento_sueldo_basico
FROM empleados
WHERE (legajo = p_empid AND fecha_alta IS NOT NULL)
OR fecha_alta IS NOT NULL;
BEGIN
FOR i IN c_emps
LOOP
DBMS_OUTPUT.PUT_LINE(
'NOMBRE: ' || i.apellido || ' ' || i.nombre || ' ' || i.legajo);
DBMS_OUTPUT.PUT_LINE(
'Antiguo Sueldo: ' || i.sueldo_basico);
DBMS_OUTPUT.PUT_LINE(
'Nuevo Sueldo: ' || i.aumento_sueldo_basico);
EXIT WHEN c_emps%NOTFOUND;
END LOOP;
END test6;
提高工资的第二个参数正在工作,但是当我为id添加值时,当前显示所有员工信息。
您需要重新查看条件“ OR fecha_alta IS NOT NULL”。 您的所有记录可能在表中都具有不为null的值。 您可以先注释掉这种情况吗?
您想要的是在未传递p_empid
情况下选择所有记录,但在传递结果时限制结果集。
问题是您的WHERE子句的格式不够紧密:
WHERE (legajo = p_empid AND fecha_alta IS NOT NULL)
OR fecha_alta IS NOT NULL;
因为条件被指定为布尔值OR,所以结果集将包含fecha_alta IS NOT NULL
每个记录,而不管是否在p_empid
传递了值。
您需要做的是在两个分支中检查p_empid
:
WHERE (legajo = p_empid AND fecha_alta IS NOT NULL)
OR (p_empid IS NULL AND fecha_alta IS NOT NULL);
此版本删除了重复项:
CREATE OR REPLACE PROCEDURE test6(
p_empid empleados.legajo%TYPE := NULL,
p_raise_salary empleados.sueldo_basico%TYPE := NULL)
IS
CURSOR c_emps
IS
SELECT legajo, apellido, nombre, fecha_alta, sueldo_basico,
(CASE
WHEN p_raise_salary IS NOT NULL THEN
sueldo_basico * p_raise_salary
ELSE
sueldo_Basico
END) aumento_sueldo_basico
FROM empleados
WHERE (p_empid IS NULL or legajo = p_empid)
AND fecha_alta IS NOT NULL;
BEGIN
FOR i IN c_emps
LOOP
DBMS_OUTPUT.PUT_LINE(
'NOMBRE: ' || i.apellido || ' ' || i.nombre || ' ' || i.legajo);
DBMS_OUTPUT.PUT_LINE(
'Antiguo Sueldo: ' || i.sueldo_basico);
DBMS_OUTPUT.PUT_LINE(
'Nuevo Sueldo: ' || i.aumento_sueldo_basico);
EXIT WHEN c_emps%NOTFOUND;
END LOOP;
END test6;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.