OneCompiler

Lab_10_2

1617

CREATE OR REPLACE PACKAGE EMP_PKG IS
PROCEDURE add_employee(p_emp_id IN VARCHAR2, p_emp_name IN VARCHAR2, p_emp_salary IN NUMBER, p_dept_id IN VARCHAR2);
PROCEDURE get_employee(p_emp_id IN VARCHAR2, p_emp_name OUT VARCHAR2, p_emp_salary OUT NUMBER, p_dept_id OUT VARCHAR2);
END EMP_PKG;

CREATE OR REPLACE PACKAGE BODY EMP_PKG IS

-- Private function to validate department ID
FUNCTION valid_deptid(p_dept_id IN VARCHAR2) RETURN BOOLEAN IS
    v_count NUMBER;
BEGIN
    SELECT COUNT(*) INTO v_count
    FROM departments
    WHERE dept_id = p_dept_id;
    
    RETURN v_count > 0;
END valid_deptid;

-- Public procedure to add an employee
PROCEDURE add_employee(p_emp_id IN VARCHAR2, p_emp_name IN VARCHAR2, p_emp_salary IN NUMBER, p_dept_id IN VARCHAR2) IS
BEGIN
    IF NOT valid_deptid(p_dept_id) THEN
        RAISE_APPLICATION_ERROR(-20010, 'Invalid department ID.');
    END IF;
    
    INSERT INTO employees (emp_id, emp_name, emp_salary, dept_id) 
    VALUES (p_emp_id, p_emp_name, p_emp_salary, p_dept_id);
EXCEPTION
    WHEN DUP_VAL_ON_INDEX THEN
        RAISE_APPLICATION_ERROR(-20011, 'Employee ID already exists.');
    WHEN OTHERS THEN
        RAISE_APPLICATION_ERROR(-20012, 'An unexpected error occurred: ' || SQLERRM);
END add_employee;

-- Public procedure to get an employee
PROCEDURE get_employee(p_emp_id IN VARCHAR2, p_emp_name OUT VARCHAR2, p_emp_salary OUT NUMBER, p_dept_id OUT VARCHAR2) IS
BEGIN
    SELECT emp_name, emp_salary, dept_id
    INTO p_emp_name, p_emp_salary, p_dept_id
    FROM employees
    WHERE emp_id = p_emp_id;
    
    IF SQL%NOTFOUND THEN
        RAISE_APPLICATION_ERROR(-20013, 'Employee ID not found.');
    END IF;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        RAISE_APPLICATION_ERROR(-20013, 'Employee ID not found.');
    WHEN OTHERS THEN
        RAISE_APPLICATION_ERROR(-20014, 'An unexpected error occurred: ' || SQLERRM);
END get_employee;

END EMP_PKG;
/