Управляющие структуры (IF / ELSE) - PullRequest
0 голосов
/ 05 мая 2019

Я пытаюсь создать блок plsql, но он не работает.Oracle говорит, что у меня есть ошибка в строке 2. Я думаю, что это может быть потому, что переменная подстановки не помещена правильно!?

DECLARE
V_ENAME EMPLOYEES.LAST_NAME%TYPE := '&LNAME';
V_SAL EMPLOYEES.SALARY%TYPE;
BEGIN
SELECT LAST_NAME, SALARY
INTO V_ENAME, V_SAL
FROM employees WHERE LAST_NAME = V_ENAME;
IF V_SAL < 3000 THEN
v_sal := v_sal + 500;
DBMS_OUTPUT.PUT_LINE (v_ename || 'have increasement ');
ELSIF V_SAL > 3000 THEN
DBMS_OUTPUT.PUT_LINE (v_ename || 'do not have increasement ');
ELSE
DBMS_OUTPUT.PUT_LINE ('error');
END IF;
END;

Ответы [ 2 ]

1 голос
/ 05 мая 2019

Поскольку может быть много сотрудников с фамилией, переданной пользователем, вы можете использовать неявный CURSOR FOR LOOP. Кроме того, добавьте first_name в вывод для ясности.

DECLARE
     v_ename employees.last_name%TYPE := '&LNAME';
     v_sal employees.salary%TYPE;
BEGIN

for rec IN ( SELECT first_name,last_name,salary
    FROM employees WHERE last_name = v_ename
) 
 LOOP

   IF rec.salary < 3000 THEN
     v_sal := rec.salary + 500;
     dbms_output.put_line (rec.first_name||' '||rec.last_name ||  
                         ' has an increase');
   ELSIF rec.salary  > 3000  THEN 
     dbms_output.put_line (rec.first_name||' '||rec.last_name || 
                         ' does not have an increase ');

   ELSE dbms_output.put_line ('error');
  END IF;
 END LOOP;
END;
/

Исполнение

..
old:DECLARE
     v_ename employees.last_name%TYPE := '&LNAME';
..
new:DECLARE
     v_ename employees.last_name%TYPE := 'Grant';

..


Douglas Grant has an increase
Kimberely Grant does not have an increase 


PL/SQL procedure successfully completed.
0 голосов
/ 05 мая 2019

Не уверен, что это ваша проблема, но на самом деле нет необходимости выбирать last_name в v_ename, если вы уже уверены, что last_name равно v_ename в предложении where.

...