практис9
практис9
практис9
--1
CREATE OR REPLACE TRIGGER delete_department_trigger
AFTER DELETE ON departments
FOR EACH ROW
BEGIN
DELETE FROM employees
WHERE department_id = :old.department_id;
END;
--
select * from employees
DELETE FROM departments WHERE department_id = 90;
--
--2
CREATE OR REPLACE TRIGGER salary_check_trigger
BEFORE INSERT ON employees
FOR EACH ROW
BEGIN
IF :new.job_id = 'SA_REP' AND (:new.salary < 2000 OR :new.salary > 7000) THEN
RAISE_APPLICATION_ERROR(-20001, 'Salary must be between 2000 and 7000 for
SA_REP');
END IF;
END;
--
INSERT INTO employees (employee_id, first_name, last_name, email, hire_date,
job_id, salary)
VALUES (1001, 'John', 'Doe', 'johndoe@example.com', SYSDATE, 'SA_REP', 1000);
--3
CREATE OR REPLACE TRIGGER insert_employee_trigger
AFTER INSERT ON employees
FOR EACH ROW
BEGIN
DBMS_OUTPUT.PUT_LINE('Trigger: Employee ' || :new.employee_id || ' inserted');
END;
--
INSERT INTO employees (employee_id, first_name, last_name, email, hire_date,
job_id, salary)
VALUES (1001, 'John', 'Doe', 'johndoe@example.com', SYSDATE, 'SA_REP', 5000);
--4
CREATE OR REPLACE TRIGGER delete_department_trigger
BEFORE DELETE ON departments
FOR EACH ROW
DECLARE
emp_count NUMBER;
BEGIN
SELECT COUNT(*) INTO emp_count
FROM employees
WHERE department_id = :old.department_id;
--
DELETE FROM departments WHERE department_id = 30;
--5
CREATE OR REPLACE TRIGGER salary_update_trigger
BEFORE UPDATE OF salary ON employees
FOR EACH ROW
BEGIN
IF :new.salary = :old.salary THEN
RAISE_APPLICATION_ERROR(-20001, 'Trigger: New salary cannot be the same as the
old salary');
END IF;
END;
--
UPDATE employees SET salary = 9000 WHERE employee_id = 103;
--select * from employees
--6
CREATE OR REPLACE TRIGGER employee_dml_trigger
BEFORE INSERT OR UPDATE OR DELETE ON employees
FOR EACH ROW
BEGIN
IF INSERTING THEN
DBMS_OUTPUT.PUT_LINE('Trigger: The employee with id ' || :new.employee_id || '
is inserted');
ELSIF UPDATING THEN
DBMS_OUTPUT.PUT_LINE('Trigger: The employee with id ' || :old.employee_id || '
is updated');
ELSIF DELETING THEN
DBMS_OUTPUT.PUT_LINE('Trigger: The employee with id ' || :old.employee_id || '
is deleted');
END IF;
END;
--
DELETE FROM employees WHERE employee_id = 106;
--====================PART 2 =================================----
--1----------
--Using
INSERT INTO employees (employee_id, first_name, last_name, email, phone_number,
hire_date, job_id, salary, commission_pct, manager_id, department_id)
VALUES (employee_seq.NEXTVAL, 'John', 'Doe', 'johndoe@example.com', '555-1234',
SYSDATE, 'SA_REP', 8000, NULL, 100, 80);
select * from employees
---2-----------------
-- answers for questions in doc file
-- 3 --
-- a --
CREATE OR REPLACE TRIGGER CHECK_SALARY_TRG
BEFORE INSERT OR UPDATE OF job_id, salary ON employees
FOR EACH ROW
WHEN (NEW.job_id <> OLD.job_id OR NEW.salary <> OLD.salary)
BEGIN
CHECK_SALARY(:NEW.job_id, :NEW.salary);
END;
-- b --
--- Перед этим нужно запустить в конце пэккейдж
BEGIN
EMP_PKG.ADD_EMPLOYEE(
p_first_name => 'Eleanor',
p_last_name => 'Beh',
p_email => 'EBEH',
p_phone => '1234567890',
p_hire_date => '27-SEP-20',
p_job => 'IT_PROG',
p_salary => 5000,
p_manager => NULL,
p_department => 30
);
END;
--
--c
UPDATE employees
SET salary = salary + 2000
WHERE job_id = 'IT_PROG';
--d
UPDATE employees
SET salary = 10000
WHERE employee_id = (
SELECT MIN(employee_id)
FROM employees
WHERE first_name = 'Eleanor' AND last_name = 'Beh'
);
--e
--Since only the job_id and not the salary has changed,
-- the CHECK_SALARY_TRG trigger will not fire.
UPDATE employees
SET job_id = 'ST_MAN'
WHERE employee_id = (SELECT employee_id
FROM employees
WHERE first_name = 'Eleanor' AND last_name = 'Beh');
---Пэккейдж
CREATE OR REPLACE PACKAGE emp_pkg IS
PROCEDURE add_employee (
p_first_name IN employees.first_name%TYPE,
p_last_name IN employees.last_name%TYPE,
p_email IN employees.email%TYPE,
p_phone IN employees.phone_number%TYPE,
p_hire_date IN employees.hire_date%TYPE,
p_job IN employees.job_id%TYPE,
p_salary IN employees.salary%TYPE,
p_manager IN employees.manager_id%TYPE,
p_department IN employees.department_id%TYPE
);
END emp_pkg;