S.
N PAGE
DATE NAME OF THE EXPERIMENT SIGNATURE
o NO
`1 SQL-DDL COMMANDS
2 SQL-DDM COMMANDS
3 SQL-TCL COMMANDS
4 PL/SQL-FIBONACCI SERIES
5 PL/SQL-FACTORIAL
6 PL/SQL-STRING REVERSE
7 PL/SQL-SUM OF SERIES
8 PL/SQL-TRIGGER
CURSOR-STUDENTS MARK ANALYSIS
9
USING CURSOR
APPLICATION-LIBRARY
10
MANAGEMENT SYSTEM
APPLICATION-STUDENT MARK
11
ANALYSIS
CONTENTS
1. DDL Commands
--Create table
CREATE TABLE Students ( id NUMBER(4) PRIMARY KEY, name VARCHAR2(20),age NUMBER(3));
-- Alter table: add a column
ALTER TABLE Students
ADD (grade VARCHAR2(2));
--Rename table
ALTER TABLE Students
RENAME TO Learners;
--Truncate data later if needed
TRUNCATE TABLE Learners;
--Drop table
DROP TABLE Learners;
OUTPUT :
[Link] COMMAND
--Create for data operations
CREATE TABLE Employees (emp_id NUMBER(3) PRIMARY KEY, ename
VARCHAR2(15),salary NUMBER(7,2));
--Insert rows
INSERT INTO Employees VALUES (101, 'Alice', 50000);
INSERT INTO Employees VALUES (102, 'Bob', 60000);
--Update salary
UPDATE Employees
SET salary = salary * 1.10
WHERE emp_id = 101;
--Delete row
DELETE FROM Employees
WHERE emp_id = 102;
--Select results
SELECT * FROM Employees;
OUTPUT :
EMP_ID ENAME SALARY
101 Alice 55000.00
[Link] COMMAND
BEGIN
--Update salary for all employees
UPDATE Employees
SET salary = salary + 1000;
SAVEPOINT sp1;
--Delete someone
DELETE FROM Employees WHERE emp_id = 101;
--Oops, rollback delete only
ROLLBACK TO sp1;
--Commit the raise
COMMIT;
END;
OUTPUT :
EMP_ID ENAME SALARY
101 Alice 56000.00
[Link]/SQL
[Link] SERIES
DECLARE
a NUMBER := 0;
b NUMBER := 1;
temp NUMBER;
n NUMBER := 10; -- Change as needed
i NUMBER;
BEGIN
DBMS_OUTPUT.PUT_LINE('Fibonacci series:');
DBMS_OUTPUT.PUT_LINE(a);
DBMS_OUTPUT.PUT_LINE(b);
FOR i IN 2..n LOOP
temp := a + b;
a := b;
b := temp;
DBMS_OUTPUT.PUT_LINE(temp);
END LOOP;
END;
/
OUTPUT:
Fibonacci series:
13
21
34
55
5. FACTORIAL
DECLARE
f NUMBER := 1;
n NUMBER := 5; -- Compute 5!
BEGIN
FOR i IN 1..n LOOP
f:=f*i;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Factorial of '||n||' is '||f);
END;
OUTPUT :
Factorial of 5 is 120
6. STRING REVERSE
DECLARE
input_str VARCHAR2(100) := 'Oracle';
rev VARCHAR2(100) := ";
BEGIN
FOR I IN REVERSE 1..LENGTH(input_str) LOOP
rev := rev || SUBSTR(input_str, i, 1);
END LOOP;
DBMS_OUTPUT.PUT_LINE('Original: ' || input_str);
DBMS_OUTPUT.PUT_LINE('Reversed: ' || rev);
END;
Output :
Original: Oracle
Reversed: elcarO
[Link] OF SERIES
DECLARE
n NUMBER := 10;
total NUMBER := 0;
BEGIN
FOR i IN 1..n LOOP
total: total + i;
END LOOP:
DBMS_OUTPUT.PUT_LINE('Sum of 1..'||n||' = '"||total);
END;
OUTPUT :
Sum of 1…10=55
[Link]
First, set up tables:
CREATE TABLE employees (emp_id NUMBER PRIMARY KEY,ename
VARCHAR2(50),salary NUMBER);
CREATE TABLE emp_audit (emp_id NUMBER,ename VARCHAR2(50),action time
TIMESTAMP,action_type VARCHAR2(10));
Then create a trigger:
CREATE OR REPLACE TRIGGER trg_emp_insert
AFTER INSERT ON employees
FOR EACH ROW
BEGIN
INSERT INTO emp_audit(emp id, ename, action time, action type)
VALUES(:NEW.emp_id, :[Link], SYSTIMESTAMP, INSERT);
END;
Testing the trigger:
INSERT INTO employees VALUES (1, 'Alice', 50000);
COMMIT;
SELECT * FROM emp_audit;
OUTPUT:
EMP_ID ENAME ACTION/_TIME ACTION/_TYPE
2025-06-10
1 Alice INSERT
[Link].123456
[Link]
[Link] Mark Analysis Using Cursor
Table Setup
CREATE TABLE students (
regno NUMBER PRIMARY KEY,
name VARCHAR2(50),
mark1 NUMBER,
mark2 NUMBER,
mark3 NUMBER);
INSERT INTO students VALUES (1, 'Ram', 40, 55, 65);
INSERT INTO students VALUES (2, 'Sita', 80, 90, 85);
INSERT INTO students VALUES (3, 'Gopal', 35, 45, 25);
--add more rows as needed
COMMIT;
SET SERVEROUTPUT ON;
DECLARE
CURSOR stud_cur IS
SELECT regno, name, mark1, mark2, mark3 FROM students;
v_reg [Link]%TYPE;
v_name [Link]%TYPE;
v_m1 students.mark1%TYPE;
v_m2 students.mark2%TYPE;
v_m3 students.mark3%TYPE;
v_total NUMBER;
v_avg NUMBER;
v_grade VARCHAR2(10);
BEGIN
OPEN stud_cur;
LOOP
FETCH stud cur INTO v reg, v name, v ml, v m2, v m3;
EXIT WHEN stud cur%NOTFOUND:
v total:=v_m1+v_m2 + v_m3;
v_avg :=v_total/3;
-- Assign grade based on average
IF v_avg<40 THEN
v_grade := 'FAIL';
ELSIF v_avg < 50 THEN
v_grade := 'C';
ELSIF v_avg < 60 THEN
v_grade := 'B';
ELSIF v_avg < 80 THEN v_grade := 'A';
ELSE
v_grade := 'HONOURS';
END IF;
DBMS_OUTPUT.PUT_LINE(
'RegNo: '||v_reg ||
'| Name: '||v_name ||
'| Total: '||v_total ||
'| Avg: '||ROUND(v_avg,2) ||
'| Grade: '||v_grade
);