Процедура с обработкой исключений

#oracle #exception #stored-procedures #plsql #sql-insert

#Oracle #исключение #хранимые процедуры #plsql #sql-вставка

Вопрос:

Создайте процедуру PL / SQL для вставки сведений о сотрудниках в таблицу Employee. Перед вставкой проверьте, подходит ли возраст сотрудника или нет. Возраст сотрудника должен быть не менее 18 лет. Значения передаются в качестве аргумента процедуре.

Если возраст действительный, вставьте запись сотрудника в таблицу и выведите сообщение «Возраст действительный — запись вставлена», иначе выведите сообщение «Возраст недействительный — запись не вставлена», вызвав исключение.

введите описание изображения здесь

 coding:
CREATE OR REPLACE PROCEDURE CHECK_AGE_ELIGIBILITY(
v_id IN EMPLOYEE.EMPID%TYPE, 
v_name IN EMPLOYEE.EMPNAME%TYPE, 
v_age IN EMPLOYEE.AGE%TYPE)AS
BEGIN 
INSERT INTO Employee(EMPID,EMPNAME,AGE)Values(103,'Robert',24);
select age from Employee;
IF AGE >=18
dbms_output.put_line('Age valid -Record inserted');
else
dbms_output.put_line('Age invalid -Record not inserted');
END; 
/

EXPECTED OUTPUT:
Age valid -Record inserted
  

Комментарии:

1. Для меня это выглядит как домашнее задание, поэтому я просто дам вам несколько советов. 103,'Robert',24 это жестко заданные значения, ваша процедура должна использовать переменные, которые вы определяете v_id, v_age … и т.д. Вы также должны проверить соответствие переменной age и выполнить вставку только в той ветке, которая это разрешает.

Ответ №1:

Вы хотите сначала проверить, а затем вставить, если проверка прошла успешно (в то время как ваш код выполняет все наоборот). Я также исправил синтаксис вашего if оператора и изменил insert оператор, чтобы он использовал аргументы процедуры вместо жестко заданных значений. Наконец, если вы хотите вызвать ошибку, используйте raison_application_error() вместо put_line() .

Это должно делать то, что вы хотите:

 create or replace procedure check_age_eligibility(
    v_id in employee.empid%type, 
    v_name in employee.empname%type, 
    v_age in employee.age%type
)
as
begin 
    if v_age >=18 then
        insert into employee(empid,empname,age)values(v_id, v_name, v_age);
        dbms_output.put_line('age valid -record inserted');
    else
        raise_application_error( -20001, 'age invalid - record not inserted' );
    end if;
end; 
/
  

Хотя это может быть не то, что вас просили сделать, пожалуйста, обратите внимание, что для этого вам не нужна процедура. Вы можете просто использовать check ограничение:

 alter table employee add constraint age_above_18 check(age >= 18);
  

Затем вы можете использовать обычные insert инструкции для обработки таблицы — для каждой строки, которая противоречит ограничению, возникает ошибка.

Демонстрация на скрипте DB

Ответ №2:

Если вы хотите включить определяемое пользователем исключение. объявите это внутри процедуры.

 create or replace PROCEDURE CHECK_AGE_ELIGIBILITY(
    v_id IN EMPLOYEE.EMPID%TYPE,
    v_name IN EMPLOYEE.EMPNAME%TYPE, 
    v_age IN EMPLOYEE.AGE%TYPE) as

not_of_age exception;

    begin
        if v_age>=18 then
            insert into EMPLOYEE(empid,empname,age) values(v_age,v_name,v_age);
            dbms_output.put_line('Age valid - Record inserted');
        else
            raise not_of_age;

        end if;
    exception
        when not_of_age then
        dbms_output.put_line('Age invalid - Record not inserted');
end;
/