Write a Pl/SQL block which calculates the percentage for each student who has passed in all subjects

Medium 🔀 If-Else Statements
👁️ 1 views 👤 By Super Admin 📅 Jan 29, 2026

❓ Question

The structure of STUDENT table is as given below STUDENT(ROLLNO,NAME,M1,M2,M3,PERCENTAGE) Write a Pl/SQL block which calculates the percentage for each student who has passed in all subjects. Passing criteria 40 out of 100. Update the STUDENT table with calculated percentage. Also display details of the students who have secured highest percentage.

✅ Solution

CREATE TABLE STUDENT (
    ROLLNO      NUMBER PRIMARY KEY,
    NAME        VARCHAR2(30),
    M1          NUMBER(3),
    M2          NUMBER(3),
    M3          NUMBER(3),
    PERCENTAGE  NUMBER(5,2)
);
==============================================================================================
INSERT INTO STUDENT VALUES (1, 'Amit', 75, 80, 70, NULL);
INSERT INTO STUDENT VALUES (2, 'Rahul', 35, 60, 55, NULL);
INSERT INTO STUDENT VALUES (3, 'Neha', 88, 90, 92, NULL);
INSERT INTO STUDENT VALUES (4, 'Priya', 40, 45, 42, NULL);
INSERT INTO STUDENT VALUES (5, 'Karan', 90, 85, 88, NULL);

COMMIT;
===============================================================================================
SET SERVEROUTPUT ON;

DECLARE
    v_percentage STUDENT.PERCENTAGE%TYPE;
    v_max_per    STUDENT.PERCENTAGE%TYPE;
BEGIN
    -- Calculate & update percentage for passed students
    FOR rec IN (
        SELECT ROLLNO, M1, M2, M3
        FROM STUDENT
        WHERE M1 >= 40 AND M2 >= 40 AND M3 >= 40
    ) LOOP
        v_percentage := (rec.M1 + rec.M2 + rec.M3) / 3;

        UPDATE STUDENT
        SET PERCENTAGE = v_percentage
        WHERE ROLLNO = rec.ROLLNO;
    END LOOP;

    COMMIT;

    -- Find highest percentage
    SELECT MAX(PERCENTAGE)
    INTO v_max_per
    FROM STUDENT;

    -- Display topper details
    DBMS_OUTPUT.PUT_LINE('Student(s) with Highest Percentage:');

    FOR s IN (
        SELECT ROLLNO, NAME, PERCENTAGE
        FROM STUDENT
        WHERE PERCENTAGE = v_max_per
    ) LOOP
        DBMS_OUTPUT.PUT_LINE(
            'RollNo: ' || s.ROLLNO ||
            ', Name: ' || s.NAME ||
            ', Percentage: ' || s.PERCENTAGE
        );
    END LOOP;

END;
/

💻 Submit Your Solution

Please login to submit your solution and earn points.

Login Now