0% found this document useful (0 votes)
17 views15 pages

Exp-1 (TCL)

Uploaded by

PARTIK MALIK
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
17 views15 pages

Exp-1 (TCL)

Uploaded by

PARTIK MALIK
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 15

EXP-1 (TCL)

-- Create the Employee table


CREATE TABLE Employee (
e_id NUMBER PRIMARY KEY,
e_name VARCHAR2(20),
e_dept VARCHAR2(20),
salary NUMBER
);

-- Insert data into the Employee table


INSERT INTO Employee VALUES (1, 'A', 'HR', 200000);
INSERT INTO Employee VALUES (2, 'B', 'Financial', 100000);
INSERT INTO Employee VALUES (3, 'C', 'HR', 50000);
INSERT INTO Employee VALUES (4, 'D', 'Financial', 80000);

-- Begin transaction and update salaries


BEGIN
-- Update salaries for employees in the HR department
UPDATE Employee
SET salary = salary + 10000
WHERE e_dept = 'HR';

-- Savepoint to mark the current state


SAVEPOINT sp1;

-- Update salaries for employees in the Financial department


UPDATE Employee
SET salary = salary + 5000
WHERE e_dept = 'Financial';

-- Rollback to savepoint sp1 to undo the update on the Financial


department
ROLLBACK TO sp1;

-- Commit the transaction to save changes


COMMIT;
END;
/

EXP-2 (DCL)
CREATE TABLE Employee (
e_id INT,
e_name VARCHAR(20),
e_dept VARCHAR(20),
salary INT
);
INSERT INTO Employee (e_id, e_name, e_dept, salary) VALUES
(1, 'A', 'HR', 200000),
(2, 'B', 'Financial', 100000),
(3, 'C', 'HR', 50000),
(4, 'D', 'Financial', 80000);

CREATE USER 'user1'@'localhost' IDENTIFIED BY 'password1';


CREATE USER 'user2'@'localhost' IDENTIFIED BY 'password2';

GRANT SELECT ON your_database_name.Employee TO 'user1'@'localhost';


GRANT INSERT, UPDATE ON your_database_name.Employee TO
'user2'@'localhost';
GRANT ALL PRIVILEGES ON your_database_name.Employee TO
'user1'@'localhost';
REVOKE INSERT ON your_database_name.Employee FROM
'user2'@'localhost';
REVOKE ALL PRIVILEGES ON your_database_name.Employee FROM
'user1'@'localhost';

EXP-3 (LOCKS)
USE kings;
CREATE TABLE students (
student_id INT PRIMARY KEY,
student_name VARCHAR(100),
hostel_id INT
);
INSERT INTO students (student_id, student_name, hostel_id) VALUES
(1, 'King', 1),
(2, 'Queen', 2),
(3, 'Warrior', 3);

-- Row-Level Lock
START TRANSACTION;
SELECT * FROM students WHERE student_id = 1 FOR UPDATE;
UPDATE students SET student_name = 'King Updated' WHERE student_id =
1;
COMMIT;
-- Exclusive Lock
START TRANSACTION;
LOCK TABLES students WRITE;
UPDATE students SET student_name = 'Queen Updated' WHERE student_id =
2;
UNLOCK TABLES;
COMMIT;

-- Shared Lock
START TRANSACTION;
SELECT * FROM students WHERE student_id = 1 LOCK IN SHARE MODE;
COMMIT;

SELECT * FROM students;

EXP-4 (To analyze and create locks and


different types of locks.)
-- 1. Create Sequences for Orders and Employee Tables
CREATE SEQUENCE orders_seq
START WITH 1
INCREMENT BY 1
NOCACHE;

CREATE SEQUENCE employee_seq


START WITH 1
INCREMENT BY 1
NOCACHE;
-- 2. Create Synonyms for Orders and Employee Tables
CREATE SYNONYM order_alias FOR Orders;
CREATE SYNONYM employee_alias FOR Employee;

-- 3. Create Tables
CREATE TABLE Orders (
order_id INT PRIMARY KEY,
order_date DATE,
customer_id INT
);

CREATE TABLE Employee (


employee_id INT PRIMARY KEY,
name VARCHAR(100),
position VARCHAR(100),
salary DECIMAL(10, 2)
);

-- 4. Insert Data into Employee Table using Sequences


INSERT INTO Employee VALUES (employee_seq.NEXTVAL, 'King', 'Software
Engineer', 120000);
INSERT INTO Employee VALUES (employee_seq.NEXTVAL, 'Queen', 'Project
Manager', 150000);
INSERT INTO Employee VALUES (employee_seq.NEXTVAL, 'Alice Johnson',
'Data Analyst', 90000);
INSERT INTO Employee VALUES (employee_seq.NEXTVAL, 'Bob Brown', 'HR
Manager', 80000);

-- 5. Create View to Show Employees with High Salary


CREATE VIEW high_salary_employees AS
SELECT name, position, salary
FROM Employee
WHERE salary > 100000;

-- 6. Query the View


SELECT * FROM high_salary_employees;

-- 7. Query Orders using Synonym


SELECT * FROM order_alias;

-- 8. Query Employees using Synonym


SELECT * FROM employee_alias;

EXP-5 (PL/SQL Control Structures)


CREATE TABLE employees (
emp_id NUMBER PRIMARY KEY,
emp_name VARCHAR2(100),
bonus NUMBER
);

CREATE TABLE sales (


sale_id NUMBER PRIMARY KEY,
emp_id NUMBER,
sale_amount NUMBER,
FOREIGN KEY (emp_id) REFERENCES employees(emp_id)
);
INSERT INTO employees (emp_id, emp_name, bonus) VALUES (1, 'King', 0);
INSERT INTO employees (emp_id, emp_name, bonus) VALUES (2, 'Queen', 0);

INSERT INTO sales (sale_id, emp_id, sale_amount) VALUES (1, 1, 500);


INSERT INTO sales (sale_id, emp_id, sale_amount) VALUES (2, 2, 1000);

DECLARE
v_emp_id employees.emp_id%TYPE;
v_emp_name employees.emp_name%TYPE;
v_bonus employees.bonus%TYPE;
v_sales_total NUMBER := 0;
BEGIN
FOR employee IN (SELECT emp_id, emp_name, bonus FROM employees)
LOOP
v_emp_id := employee.emp_id;
v_emp_name := employee.emp_name;
v_bonus := employee.bonus;

SELECT SUM(sale_amount)
INTO v_sales_total
FROM sales
WHERE emp_id = v_emp_id;

IF v_sales_total > 1000 THEN


v_bonus := 500;
ELSE
v_bonus := 100;
END IF;

UPDATE employees
SET bonus = v_bonus
WHERE emp_id = v_emp_id;

-- Output the updated bonus for the employee


DBMS_OUTPUT.PUT_LINE('Employee: ' || v_emp_name || ' | Sales Total: '
|| v_sales_total || ' | New Bonus: ' || v_bonus);
END LOOP;

COMMIT;
END;
/

EXP-6 (To Implement Pl/SQL programming


using Cursors)

CREATE TABLE employees (


emp_id NUMBER PRIMARY KEY,
emp_name VARCHAR2(100),
bonus NUMBER
);
INSERT INTO employees (emp_id, emp_name, bonus) VALUES (1, 'King', 0);
INSERT INTO employees (emp_id, emp_name, bonus) VALUES (2, 'Queen', 0);
DECLARE
v_emp_name employees.emp_name%TYPE;
v_bonus employees.bonus%TYPE;
BEGIN
-- Implicit cursor
SELECT emp_name, bonus
INTO v_emp_name, v_bonus
FROM employees
WHERE emp_id = 1;

DBMS_OUTPUT.PUT_LINE('Employee Name: ' || v_emp_name || ' | Bonus: '


|| v_bonus);
END;
/

DECLARE
-- explicit cursor
CURSOR employee_cursor IS
SELECT emp_id, emp_name, bonus
FROM employees;

v_emp_id employees.emp_id%TYPE;
v_emp_name employees.emp_name%TYPE;
v_bonus employees.bonus%TYPE;
BEGIN
-- Open the cursor
OPEN employee_cursor;
LOOP
FETCH employee_cursor INTO v_emp_id, v_emp_name, v_bonus;
EXIT WHEN employee_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Employee ID: ' || v_emp_id || ' | Name: ' ||
v_emp_name || ' | Bonus: ' || v_bonus);
END LOOP;
CLOSE employee_cursor;
END;
/

EXP-7 (Exceptions)

CREATE TABLE employees (


emp_id NUMBER PRIMARY KEY,
emp_name VARCHAR2(100),
bonus NUMBER
);

DECLARE
--user-defined exception
low_bonus_exception EXCEPTION;

v_emp_id employees.emp_id%TYPE := 1;
v_emp_name employees.emp_name%TYPE := 'King';
v_bonus employees.bonus%TYPE := 400;
BEGIN
IF v_bonus < 500 THEN
-- Raise the user-defined exception
RAISE low_bonus_exception;
END IF;

BEGIN
INSERT INTO employees (emp_id, emp_name, bonus)
VALUES (v_emp_id, v_emp_name, v_bonus);
COMMIT;
DBMS_OUTPUT.PUT_LINE('Employee inserted successfully!');

EXCEPTION
-- Exception handling for unique constraint violation (duplicate emp_id)
WHEN DUP_VAL_ON_INDEX THEN
DBMS_OUTPUT.PUT_LINE('Error: Employee with ID ' || v_emp_id || '
already exists.');

-- User-defined exception
WHEN low_bonus_exception THEN
DBMS_OUTPUT.PUT_LINE('Error: Employee bonus is too low. It must
be at least 500.');

-- Exception handling for any other errors


WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
END;
END;
/

EXP-8 (Packages and triggers)

-- Create the employees table


CREATE TABLE employees (
emp_id NUMBER PRIMARY KEY,
emp_name VARCHAR2(100),
bonus NUMBER
);

-- Create the package specification


CREATE OR REPLACE PACKAGE emp_pkg AS
-- Procedure to insert an employee into the employees table
PROCEDURE insert_employee(p_emp_id IN NUMBER, p_emp_name IN
VARCHAR2, p_bonus IN NUMBER);

-- Function to get an employee's bonus


FUNCTION get_employee_bonus(p_emp_id IN NUMBER) RETURN NUMBER;
END emp_pkg;
/

-- Create the package body


CREATE OR REPLACE PACKAGE BODY emp_pkg AS
-- Procedure to insert an employee into the employees table
PROCEDURE insert_employee(p_emp_id IN NUMBER, p_emp_name IN
VARCHAR2, p_bonus IN NUMBER) IS
BEGIN
INSERT INTO employees (emp_id, emp_name, bonus)
VALUES (p_emp_id, p_emp_name, p_bonus);
COMMIT;
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
DBMS_OUTPUT.PUT_LINE('Error: Employee ID ' || p_emp_id || ' already
exists.');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
END insert_employee;

-- Function to get an employee's bonus


FUNCTION get_employee_bonus(p_emp_id IN NUMBER) RETURN NUMBER
IS
v_bonus employees.bonus%TYPE;
BEGIN
SELECT bonus INTO v_bonus
FROM employees
WHERE emp_id = p_emp_id;
RETURN v_bonus;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Error: Employee with ID ' || p_emp_id || '
not found.');
RETURN NULL;
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
RETURN NULL;
END get_employee_bonus;
END emp_pkg;
/

-- Anonymous block to test the package


DECLARE
v_bonus NUMBER;
BEGIN
emp_pkg.insert_employee(3, 'John Doe', 1500);
v_bonus := emp_pkg.get_employee_bonus(3);
DBMS_OUTPUT.PUT_LINE('Employee Bonus: ' || v_bonus);
END;
/

CREATE OR REPLACE TRIGGER display_salary_changes


BEFORE INSERT OR UPDATE OR DELETE ON employees
FOR EACH ROW
DECLARE
sal_diff NUMBER;
BEGIN
-- Calculate salary difference on UPDATE or DELETE
IF UPDATING OR DELETING THEN
sal_diff := :NEW.bonus - :OLD.bonus;
DBMS_OUTPUT.PUT_LINE('Old Bonus: ' || :OLD.bonus);
DBMS_OUTPUT.PUT_LINE('New Bonus: ' || :NEW.bonus);
DBMS_OUTPUT.PUT_LINE('Bonus Difference: ' || sal_diff);
END IF;
END;
/

You might also like