2017-06-03 95 views
0

我正在寫一個簡單的存儲過程來檢索關於所有員工的信息,但是,如果傳遞參數,我會添加2個參數來檢索信息,只有一個員工。我的意圖是創建一個遊標,並在WHERE使用參數添加條件,但它現在不工作。你有什麼主意嗎?謝謝!如何在此過程的WHERE條件中使用Case子句?

  1. 第一個參數用於員工ID。
  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參數添加值顯示當前所有員工的信息。

enter image description here

+0

不熟悉Oracle,但會'WHERE(legajo = p_empid OR p_empid IS NULL)和(fecha_alta不是NULL);'工作? –

+0

感謝您回覆賈斯汀。我嘗試過,但不工作! –

+0

英語中的legajo和fetch_alta是什麼? – maSTAShuFu

回答

0

你需要重新考慮的條件 「OR fecha_alta IS NOT NULL」。您的表中所有記錄可能都有一個非空值。你可以先評論一下這種情況嗎?

0

如果p_empid沒有通過但是限制結果集通過時,您想要選擇所有記錄。

的問題是你沒有形成足夠緊條款:

WHERE (legajo = p_empid AND fecha_alta IS NOT NULL) 
    OR  fecha_alta IS NOT NULL; 

因爲條件被指定爲布爾或結果集將包括記錄下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;