2017-06-03 6 views
0

私は、すべての従業員に関する情報を取得するための単純なストアドプロシージャを作成していますが、パラメータ渡しの場合、2人のパラメータを追加して1人の従業員だけを取得します。私の意図はカーソルを作成し、パラメータを使用してWHEREに条件を追加することですが、現在は機能していません。あなたは何か考えていますか?ありがとう!どのようにこの手順でWHERE条件内でCase句を使用できますか?

  1. 最初のパラメータは従業員IDです。
  2. 第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; 

2番目のパラメータが動作しているが、私はidパラメータの値を追加するときに、現在のすべての従業員情報を表示しています。

enter image description here

+0

ないだろうが、 'WHERE(legajo = p_empid OR p_empid:

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

このバージョンでは、重複を削除しますIS NULL)AND(fecha_altaはNULLではありません); –

+0

お返事ありがとうJustin。私はそれを試したが、動作していない! –

+0

legajoとfetch_altaは英語で何ですか? – maSTAShuFu

答えて

0

あなたは再度条件を検討する必要がある "OR fecha_altaはNULLではありません"。すべてのレコードがテーブルに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です:

オラクルに精通
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; 
関連する問題