#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
инструкции для обработки таблицы — для каждой строки, которая противоречит ограничению, возникает ошибка.
Ответ №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;
/