w3resource

Creating a Subclass "Manager" in PL/SQL Inheriting from "Employee" Class

PL/SQL OOP: Exercise-4 with Solution

Write a PL/SQL code to create a "Manager" subclass inheriting from the "Employee" class, and add an attribute to store the number of employees managed.

A subclasses "Manager" subclass that inherits from the "Employee" class and add an additional attribute to store the number of employees managed by the manager.

Sample Solution:

PL/SQL Code:

-- Create the base "Employee" class
CREATE OR REPLACE TYPE Employee AS OBJECT (
emp_id NUMBER, -- Employee ID attribute
emp_nameVARCHAR2(100), -- Employee name attribute
salary NUMBER, -- Salary attribute

    -- Method to calculate annual bonus
    MEMBER FUNCTION calculate_bonus RETURN NUMBER -- Method to calculate bonus
);
/

Create the body of the "Employee" class

PL/SQL Code:

CREATE OR REPLACE TYPE BODY Employee AS
    -- Method implementation to calculate the annual bonus
    MEMBER FUNCTION calculate_bonus RETURN NUMBER IS
bonus_percentage NUMBER; -- Percentage of bonus
bonus_amount NUMBER; -- Calculated bonus amount
    BEGIN
        -- Determine the bonus percentage based on salary
        IF self.salary< 50000 THEN
bonus_percentage := 0.1; -- 10% bonus for salaries below 50000
        ELSIF self.salary< 100000 THEN
bonus_percentage := 0.15; -- 15% bonus for salaries between 50000 and 100000
        ELSE
bonus_percentage := 0.2; -- 20% bonus for salaries above 100000
        END IF;

        -- Calculate the bonus amount
bonus_amount := self.salary * bonus_percentage;

        -- Return the calculated bonus
        RETURN bonus_amount;
    END;
END;
/

Create the "Manager" class with additional attribute and method

PL/SQL Code:

-- Create the "Manager" class with additional attribute and method
CREATE OR REPLACE TYPE Manager AS OBJECT (
emp_id NUMBER, -- Employee ID
emp_nameVARCHAR2(100), -- Employee Name
salary NUMBER, -- Salary
employees_managed NUMBER, -- Additional attribute for the "Manager" class

    -- Constructor for the "Manager" class
    CONSTRUCTOR FUNCTION Manager(
emp_id NUMBER,
emp_name VARCHAR2,
salary NUMBER,
employees_managed NUMBER
    ) RETURN SELF AS RESULT,

    -- Method to calculate bonus for managers (additional method for "Manager" class)
    MEMBER FUNCTION calculate_bonus RETURN NUMBER
);
/

Create the body of the "Manager" class

PL/SQL Code:

-- Create the body of the "Manager" class
CREATE OR REPLACE TYPE BODY Manager AS
    -- Constructor implementation for the "Manager" class
    CONSTRUCTOR FUNCTION Manager(
emp_id NUMBER,
emp_name VARCHAR2,
salary NUMBER,
employees_managed NUMBER
    ) RETURN SELF AS RESULT IS
    BEGIN
SELF.emp_id := emp_id; -- Set Employee ID
SELF.emp_name := emp_name; -- Set Employee Name
SELF.salary := salary; -- Set Salary
SELF.employees_managed := employees_managed; -- Set Number of Employees Managed
        RETURN; -- Return the created object
    END;

    -- Method implementation to calculate the annual bonus for managers
    MEMBER FUNCTION calculate_bonus RETURN NUMBER IS
bonus_percentage NUMBER; -- Bonus percentage based on salary
bonus_amount NUMBER; -- Calculated bonus amount
    BEGIN
        -- Determine the bonus percentage based on salary and number of employees managed
        IF self.salary< 50000 THEN
bonus_percentage := 0.1; -- 10% bonus for salaries below 50000
        ELSIF self.salary< 100000 THEN
bonus_percentage := 0.15; -- 15% bonus for salaries between 50000 and 100000
        ELSE
bonus_percentage := 0.2; -- 20% bonus for salaries above 100000
        END IF;

        -- Calculate the bonus amount including a bonus based on employees managed
bonus_amount := (self.salary + self.employees_managed * 1000) * bonus_percentage;

        -- Return the calculated bonus
        RETURN bonus_amount;
    END;
END;
/

To get the result for this code, createsan instances of both the "Employee" and "Manager" classes and call the calculate_bonus method for each of them.

PL/SQL Code:

-- Create an instance of the "Employee" class
DECLARE
emp_obj Employee; -- Declare an Employee object
emp_bonus NUMBER; -- Variable to store bonus
BEGIN
emp_obj := Employee(1, 'John Doe', 75000); -- Instantiate Employee object with ID, Name, and Salary
emp_bonus := emp_obj.calculate_bonus; -- Calculate bonus using the method
    DBMS_OUTPUT.PUT_LINE('Employee Bonus: ' || emp_bonus); -- Display the result
END;
/

-- Create an instance of the "Manager" class
DECLARE
manager_obj Manager; -- Declare a Manager object
manager_bonus NUMBER; -- Variable to store bonus
BEGIN
manager_obj := Manager(2, 'Jane Smith', 90000, 10); -- Instantiate Manager object with ID, Name, Salary, and Employees Managed
manager_bonus := manager_obj.calculate_bonus; -- Calculate bonus using the method
    DBMS_OUTPUT.PUT_LINE('Manager Bonus: ' || manager_bonus); -- Display the result
END;
/

Sample Output:

Statement processed.
Employee Bonus: 11250
Statement processed.
Manager Bonus: 15000

Flowchart:

Flowchart: Create the base 'Employee' class
Flowchart: Create the body of the 'Employee' class
Flowchart: Create the 'Manager' class with additional attribute and method
Flowchart: 'Manager' Class
Flowchart:  'Employee' Class

Explanation:

In this example, the Employee class is subclassed by the Manager class. The Manager class, which implements specialized behavior while still inheriting the Employee class's functionality.

Previous: Method to calculate annual bonus based on salary in PL/SQL's "Employee" Class.
Next: Creating a "Shape" Class in PL/SQL with Area Calculation Method.

What is the difficulty level of this exercise?



Become a Patron!

Follow us on Facebook and Twitter for latest update.

It will be nice if you may share this link in any developer community or anywhere else, from where other developers may find this content. Thanks.

https://w3resource.com/plsql-exercises/oop/plsql-oop-exercise-4.php