---------------------------------------------------------------------
CREATE SEQUENCE users_seq START WITH 1 INCREMENT BY 1;
CREATE TABLE users (
id NUMBER,
username VARCHAR2(100),
email VARCHAR2(100),
password VARCHAR2(100),
CONSTRAINT pk_users PRIMARY KEY (id)
);
CREATE OR REPLACE TRIGGER users_trigger
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
SELECT users_seq.NEXTVAL INTO :new.id FROM dual;
END;
INSERT INTO users (id, username, email, password)
VALUES (2, 'rakib', '
[email protected]', '123123');
---------------------------------------------------------------------
CREATE SEQUENCE tournament_seq START WITH 1 INCREMENT BY 1;
CREATE TABLE Tournament (
tournament_id NUMBER,
tournament_name VARCHAR2(100),
tournament_date DATE,
tournament_type VARCHAR2(50),
CONSTRAINT pk_tournament PRIMARY KEY (tournament_id)
);
CREATE OR REPLACE TRIGGER tournament_trigger
BEFORE INSERT ON Tournament
FOR EACH ROW
BEGIN
SELECT tournament_seq.NEXTVAL INTO :new.tournament_id FROM dual;
END;
INSERT INTO Tournament ( tournament_name, tournament_date, tournament_type)
VALUES ('Pubg Tournament', TO_DATE('2024-07-10', 'YYYY-MM-DD'), 'Pubg');
INSERT INTO Tournament ( tournament_name, tournament_date, tournament_type)
VALUES ( 'Chess Tournament', TO_DATE('2024-04-20', 'YYYY-MM-DD'), 'Chess');
INSERT INTO Tournament (tournament_name, tournament_date, tournament_type)
VALUES ( 'Football Championship', TO_DATE('2024-05-15', 'YYYY-MM-DD'), 'Football');
INSERT INTO Tournament (tournament_name, tournament_date, tournament_type)
VALUES ( 'Football League', TO_DATE('2024-05-14', 'YYYY-MM-DD'), 'Football');
INSERT INTO Tournament ( tournament_name, tournament_date, tournament_type)
VALUES ( 'Basketball League', TO_DATE('2024-06-10', 'YYYY-MM-DD'), 'Basketball');
INSERT INTO Tournament ( tournament_name, tournament_date, tournament_type)
VALUES ('Pubg Tournament 2', TO_DATE('2024-07-10', 'YYYY-MM-DD'), 'Pubg');
---------------------------------------------------------------------
CREATE SEQUENCE organizer_seq START WITH 1 INCREMENT BY 1;
CREATE TABLE Organizer (
organizer_id NUMBER,
organizer_name VARCHAR2(100),
tournament_id NUMBER,
CONSTRAINT pk_organizer PRIMARY KEY (organizer_id),
CONSTRAINT fk_tournament_id FOREIGN KEY (tournament_id) REFERENCES
Tournament(tournament_id)
);
CREATE OR REPLACE TRIGGER organizer_trigger
BEFORE INSERT ON Organizer
FOR EACH ROW
BEGIN
SELECT organizer_seq.NEXTVAL INTO :new.organizer_id FROM dual;
END;
INSERT INTO Organizer ( organizer_name, tournament_id)
VALUES ( 'John Doe', 1);
INSERT INTO Organizer ( organizer_name, tournament_id)
VALUES ( 'Jane Smith', 5);
INSERT INTO Organizer ( organizer_name, tournament_id)
VALUES ( 'Michael Johnson', 1);
UPDATE Organizer
SET organizer_name = 'Jamil Reza', tournament_id = 3
WHERE organizer_id = 6;
-------------------------------------------------------------------------
CREATE TABLE info (
tournament_type VARCHAR2(50),
duration NUMBER,
tournament_id NUMBER,
CONSTRAINT fk_tournament FOREIGN KEY (tournament_id) REFERENCES
Tournament(tournament_id)
);
---------------------------------------------------------------------------
CREATE TABLE organizer_change_record (
organizer_id NUMBER,
old_organizer_name VARCHAR2(100),
new_organizer_name VARCHAR2(100),
old_tournament_id NUMBER,
new_tournament_id NUMBER,
change_date DATE
);
------------------------------------------------------------
TRIGGER
--------------------------------------------------------------
1
CREATE OR REPLACE TRIGGER insert_info_trigger
BEFORE INSERT ON info
FOR EACH ROW
BEGIN
SELECT tournament_type INTO :new.tournament_type
FROM Tournament
WHERE tournament_id = :new.tournament_id;
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL; -- Do nothing if no matching tournament is found
END;
INSERT INTO info (tournament_id, duration)
VALUES (3, 100);
INSERT INTO info (tournament_id, duration)
VALUES (2, 60);
-----------------------------------------------------------------------------------
CREATE OR REPLACE TRIGGER organizer_update_trigger
BEFORE UPDATE ON Organizer
FOR EACH ROW
BEGIN
IF :OLD.organizer_name != :NEW.organizer_name OR :OLD.tournament_id !
= :NEW.tournament_id THEN
INSERT INTO organizer_change_record (organizer_id, old_organizer_name,
new_organizer_name, old_tournament_id, new_tournament_id, change_date)
VALUES
(:OLD.organizer_id, :OLD.organizer_name, :NEW.organizer_name, :OLD.tournament_id, :
NEW.tournament_id, SYSDATE);
END IF;
END;
-----------------------------------------------------------------------------------
----
CREATE OR REPLACE TRIGGER trg_check_organizer_tournament
BEFORE INSERT OR UPDATE ON ORGANIZER
FOR EACH ROW
DECLARE
v_tournament_count NUMBER;
BEGIN
IF :NEW.TOURNAMENT_ID IS NOT NULL THEN
SELECT COUNT(*) INTO v_tournament_count
FROM TOURNAMENT
WHERE TOURNAMENT_ID = :NEW.TOURNAMENT_ID;
IF v_tournament_count = 0 THEN
RAISE_APPLICATION_ERROR(-20001, 'Invalid tournament ID. this tournament
id is not exist on the Tournament table so Cannot insert or update organizer.');
END IF;
END IF;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE = -20001 THEN
RAISE;
END IF;
END;
------------------------------------------------------------------
CREATE SEQUENCE tournament_seq START WITH 1 INCREMENT BY 1;
CREATE OR REPLACE TRIGGER tournament_trigger
BEFORE INSERT ON Tournament
FOR EACH ROW
BEGIN
SELECT tournament_seq.NEXTVAL INTO :new.tournament_id FROM dual;
END;
--------------------------------------------------
function
--------------------------------------------------
1. Retrieves information about a tournament based on the provided tournament ID.
CREATE OR REPLACE FUNCTION get_tournament_info(
p_tournament_id IN NUMBER
) RETURN VARCHAR2 AS
v_tournament_info VARCHAR2(500);
BEGIN
SELECT TOURNAMENT_NAME || ' - ' || TOURNAMENT_DATE || ' - ' || TOURNAMENT_TYPE
INTO v_tournament_info
FROM TOURNAMENT
WHERE TOURNAMENT_ID = p_tournament_id;
RETURN v_tournament_info;
END get_tournament_info;
SELECT get_tournament_info(123) AS tournament_info
FROM dual;
---------------------------------------------------------
2. Calculates the total duration of all tournaments.
CREATE OR REPLACE FUNCTION calculate_total_duration RETURN NUMBER AS
v_total_duration NUMBER := 0;
BEGIN
SELECT SUM(DURATION) INTO v_total_duration FROM INFO;
RETURN v_total_duration;
END calculate_total_duration;
SELECT calculate_total_duration() AS total_duration FROM dual;
------------------------------------------------------------
3. Validates user credentials by checking if the provided username and password
match any user in the database.
CREATE OR REPLACE FUNCTION validate_user_credentials(
p_username IN VARCHAR2,
p_password IN VARCHAR2
) RETURN BOOLEAN AS
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count
FROM USERS
WHERE USERNAME = p_username
AND PASSWORD = p_password;
IF v_count > 0 THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END validate_user_credentials;
DECLARE
v_is_valid BOOLEAN;
BEGIN
v_is_valid := validate_user_credentials('rakib', '123123');
IF v_is_valid THEN
DBMS_OUTPUT.PUT_LINE('User credentials are valid');
ELSE
DBMS_OUTPUT.PUT_LINE('Invalid username or password');
END IF;
END;
-------------------------------------------------------
4. Retrieves organizers associated with a specific tournament and outputs their
names.
CREATE OR REPLACE PROCEDURE get_organizers_for_tournament(
p_tournament_id IN NUMBER
) AS
BEGIN
FOR organizer_rec IN (SELECT ORGANIZER_NAME FROM ORGANIZER WHERE TOURNAMENT_ID
= p_tournament_id) LOOP
DBMS_OUTPUT.PUT_LINE('Organizer: ' || organizer_rec.ORGANIZER_NAME);
END LOOP;
END get_organizers_for_tournament;
DECLARE
v_tournament_id NUMBER := 1;
BEGIN
get_organizers_for_tournament(v_tournament_id);
END;
---------------------------------------------------------------