📘 PL/SQL Practice Guide: Functions, Procedures, Triggers

📌 Functions in PL/SQL

🔹 Syntax

CREATE OR REPLACE FUNCTION function_name (
    param1 IN data_type,
    param2 IN data_type
) RETURN return_data_type IS
BEGIN
    -- logic
    RETURN some_value;
END;
/

✅ Practice Questions with Solutions

1. Check Even or Odd

CREATE OR REPLACE FUNCTION check_even_odd(n IN NUMBER) RETURN VARCHAR2 IS
BEGIN
    IF MOD(n, 2) = 0 THEN
        RETURN 'EVEN';
    ELSE
        RETURN 'ODD';
    END IF;
END;
/

2. Get Maximum of Two Numbers

CREATE OR REPLACE FUNCTION get_max(a IN NUMBER, b IN NUMBER) RETURN NUMBER IS
BEGIN
    IF a > b THEN
        RETURN a;
    ELSE
        RETURN b;
    END IF;
END;
/

3. Count Vowels in a String

CREATE OR REPLACE FUNCTION count_vowels(str IN VARCHAR2) RETURN NUMBER IS
    count NUMBER := 0;
    ch CHAR;
BEGIN
    FOR i IN 1..LENGTH(str) LOOP
        ch := LOWER(SUBSTR(str, i, 1));
        IF ch IN ('a', 'e', 'i', 'o', 'u') THEN
            count := count + 1;
        END IF;
    END LOOP;
    RETURN count;
END;
/

4. Check Palindrome

CREATE OR REPLACE FUNCTION is_palindrome(str IN VARCHAR2) RETURN VARCHAR2 IS
    reversed_str VARCHAR2(1000) := '';
BEGIN
    FOR i IN REVERSE 1..LENGTH(str) LOOP
        reversed_str := reversed_str || SUBSTR(str, i, 1);
    END LOOP;

    IF LOWER(str) = LOWER(reversed_str) THEN
        RETURN 'YES';
    ELSE
        RETURN 'NO';
    END IF;
END;
/

5. Sum of Digits

CREATE OR REPLACE FUNCTION sum_of_digits(n IN NUMBER) RETURN NUMBER IS
    sum NUMBER := 0;
    digit NUMBER;
    num NUMBER := n;
BEGIN
    WHILE num > 0 LOOP
        digit := MOD(num, 10);
        sum := sum + digit;
        num := FLOOR(num / 10);
    END LOOP;
    RETURN sum;
END;
/

🔧 Procedures in PL/SQL

🔹 Syntax

CREATE OR REPLACE PROCEDURE procedure_name (param1 IN/OUT data_type) IS
BEGIN
    -- logic
END;
/

✅ Practice Questions with Solutions

1. Procedure to Print Square

CREATE OR REPLACE PROCEDURE print_square(n IN NUMBER) IS
BEGIN
    DBMS_OUTPUT.PUT_LINE('Square: ' || (n * n));
END;
/

2. Procedure to Update Employee Salary

CREATE OR REPLACE PROCEDURE increase_salary(empId IN NUMBER) IS
BEGIN
    UPDATE employees
    SET salary = salary * 1.10
    WHERE emp_id = empId;
    COMMIT;
END;
/

3. Procedure with OUT Parameter for Factorial

CREATE OR REPLACE PROCEDURE find_factorial(n IN NUMBER, result OUT NUMBER) IS
    fact NUMBER := 1;
BEGIN
    FOR i IN 1..n LOOP
        fact := fact * i;
    END LOOP;
    result := fact;
END;
/

🔥 Triggers in PL/SQL

🔹 Syntax

CREATE OR REPLACE TRIGGER trigger_name
BEFORE/AFTER INSERT/UPDATE/DELETE ON table_name
FOR EACH ROW
BEGIN
    -- logic
END;
/

✅ Practice Questions with Solutions

1. BEFORE INSERT Trigger

CREATE OR REPLACE TRIGGER trg_set_created_at
BEFORE INSERT ON students
FOR EACH ROW
BEGIN
    :NEW.created_at := SYSDATE;
END;
/

2. AFTER UPDATE Trigger for Salary Audit

CREATE OR REPLACE TRIGGER trg_salary_audit
AFTER UPDATE OF salary ON employees
FOR EACH ROW
BEGIN
    INSERT INTO salary_audit(emp_id, old_salary, new_salary, change_date)
    VALUES(:OLD.emp_id, :OLD.salary, :NEW.salary, SYSDATE);
END;
/

3. BEFORE DELETE Trigger to Prevent Deletion

CREATE OR REPLACE TRIGGER trg_prevent_delete
BEFORE DELETE ON departments
FOR EACH ROW
BEGIN
    RAISE_APPLICATION_ERROR(-20001, 'Deletion is not allowed on departments table.');
END;
/

📚 Additional Practice Questions

🔧 Functions

🔹 6. Reverse a String

Question: Write a function to reverse a given string.