[英]How Can I use Case clause within WHERE condition in this procedure?
I'm writing a simple stored procedure for retrieve information about all employees but, I'd add 2 parameters to retrieve information only one employee if is passed for parameter. 我正在编写一个简单的存储过程来检索有关所有员工的信息,但是,如果为参数传递了参数,我将添加2个参数以仅检索一位员工的信息。 My intention is create a cursor and add condition in WHERE using parameters but It is not working for now. 我的意图是使用参数在WHERE中创建一个游标并添加条件,但目前不起作用。 Do you have any idea? 你有什么主意吗? Thanks! 谢谢!
The procedure is: 程序是:
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;
Second parameter for raise salary is working but when I add a value for id parameter is currently displaying all employees info. 提高工资的第二个参数正在工作,但是当我为id添加值时,当前显示所有员工信息。
You need to re look into the condition "OR fecha_alta IS NOT NULL". 您需要重新查看条件“ OR fecha_alta IS NOT NULL”。 All of your records may be having a not null value in your table. 您的所有记录可能在表中都具有不为null的值。 Can you first try by commenting out this condition ? 您可以先注释掉这种情况吗?
What you want is to select all records if the p_empid
is not passed but restrict the result set when it is passed. 您想要的是在未传递p_empid
情况下选择所有记录,但在传递结果时限制结果集。
The problem is your WHERE clause is not formed tightly enough: 问题是您的WHERE子句的格式不够紧密:
WHERE (legajo = p_empid AND fecha_alta IS NOT NULL)
OR fecha_alta IS NOT NULL;
Because the condition is specified as a Boolean OR the result sets will include every record where fecha_alta IS NOT NULL
, regardless of whether a values is passed in p_empid
. 因为条件被指定为布尔值OR,所以结果集将包含fecha_alta IS NOT NULL
每个记录,而不管是否在p_empid
传递了值。
What you need to do is check p_empid
in both branches: 您需要做的是在两个分支中检查p_empid
:
WHERE (legajo = p_empid AND fecha_alta IS NOT NULL)
OR (p_empid IS NULL AND fecha_alta IS NOT NULL);
This version removes the duplication: 此版本删除了重复项:
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.