简体   繁体   English

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

[英]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! 谢谢!

  1. First parameter is for employee id. 第一个参数用于员工编号。
  2. Second parameter is for a raise salary. 第二个参数是加薪。

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.

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