繁体   English   中英

在此过程中,如何在WHERE条件下使用Case子句?

[英]How Can I use Case clause within WHERE condition in this procedure?

我正在编写一个简单的存储过程来检索有关所有员工的信息,但是,如果为参数传递了参数,我将添加2个参数以仅检索一位员工的信息。 我的意图是使用参数在WHERE中创建一个游标并添加条件,但目前不起作用。 你有什么主意吗? 谢谢!

  1. 第一个参数用于员工编号。
  2. 第二个参数是加薪。

程序是:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM