Передать служащего в качестве аргумента процедуры и изменить зарплату этому работнику? - PullRequest
0 голосов
/ 14 января 2019

ORA-06550: строка 4, колонка 3 PLS-00905: объект HR.procempno недействителен

- я пробовал этот код -

create or replace procedure procempno(p_no in number)
IS
  v_salary number(10,2);
begin
  v_salary:=(select salary from emp where employee_id=p_no);
if v_salary>1000 then
  update emp set salary=v_salary*1.75;
else 
  update emp set salary=5000;
end if;
Exception when no_data_found then
  dbms_output.put_line(p_empno||' doesnt exists');
end procempno;                     

- Ниже мой недавний код -

create or replace procedure procempno(p_no in number)
IS
v_salary number(10,2);
begin
  select salary into v_salary from emp where employee_id=p_no;
  if v_salary>1000 then
    update emp set salary=v_salary*1.75 where employee_id=p_no;
  else 
    update emp set salary=5000 where employee_id=p_no;
  end if;
Exception when no_data_found then
  dbms_output.put_line(p_empno||' doesnt exists');
end procempno;                                                                   

- Выполнение с использованием блока PLSQL -

declare 
  v_empno number;
begin
  procempno(&v_empno);
end;

Давайте рассмотрим, empno = 100 имеет зарплату = 25000. Если мы дадим ввод для empno = 100, тогда он проверяет условие: 25000> 1000, если да, тогда обновите salary = salary * 1.75. В противном случае обновите зарплату = 5000

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Вы можете избежать выбора текущей зарплаты в локальную переменную и обновлять ее напрямую. Для более красивого вывода я объявил RETVAL, который будет использоваться для отображения новой зарплаты.

Вот пример: во-первых, я создам временную таблицу на основе таблицы EMP Скотта (чтобы она выглядела как ваша):

SQL> create table t_emp as
  2    select empno as employee_id,
  3           sal   as salary
  4    from emp;

Table created.

Процедура: полезная часть - строки 5 - 9, которые делают то, что вы хотели. Остальное не обязательно. В строках 12-16 я проверяю, было ли что-либо обновлено (т. Е. Сотрудник с P_NO существует - обратите внимание, что мне не нужен обработчик исключений для NO_DATA_FOUND в этом случае).

SQL> create or replace procedure procempno (p_no in number)
  2  is
  3    retval t_emp.salary%type;
  4  begin
  5    update t_emp e set
  6      e.salary = case when e.salary > 1000 then e.salary * 1.75
  7                      else 5000
  8                 end
  9      where e.employee_id = p_no
 10      returning e.salary into retval;
 11
 12    if sql%rowcount = 0 then
 13       dbms_output.put_line(p_no || ' does not exist');
 14    else
 15       dbms_output.put_line('Salary updated to ' || retval);
 16    end if;
 17  end;
 18  /

Procedure created.

SQL>

Тестирование:

SQL> set serveroutput on
SQL> begin procempno(7369); end;
  2  /
Salary updated to 5000

PL/SQL procedure successfully completed.

SQL> begin procempno(7499); end;
  2  /
Salary updated to 2800

PL/SQL procedure successfully completed.

SQL> begin procempno(1111); end;
  2  /
1111 does not exist

PL/SQL procedure successfully completed.

SQL>
0 голосов
/ 14 января 2019

У вас ошибка ввода в строке

dbms_output.put_line(p_empno||' doesnt exists');

Вы должны использовать p_no

dbms_output.put_line(p_no||' doesnt exists');

Не забудьте COMMIT и используйте хороший кодовый стандарт

CREATE OR REPLACE PROCEDURE procempno(p_no IN emp.employee_id%TYPE) IS
  v_salary emp.salary%TYPE;
BEGIN
  SELECT salary
    INTO v_salary
    FROM emp
   WHERE employee_id = p_no;

  IF v_salary > 1000
  THEN
    UPDATE emp
       SET salary = v_salary * 1.75
     WHERE employee_id = p_no;
  ELSE
    UPDATE emp
       SET salary = 5000
     WHERE employee_id = p_no;
  END IF;

  COMMIT;
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    dbms_output.put_line(p_no || ' doesnt exists');
END procempno;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...