Εργαστηριακές ασκήσεις στις Βάσεις Δεδομένων ΙΙ:
Χρήση stored procedures: cursors, functions, procedures, triggers
Transactions: Commit, Rollback, Isolation levels
Δημιουργία βάσης δεδομένων my_training
σελ | 1
Η παρακάτω βάση δεδομένων training βρίσκεται στην Τρίτη Κανονική Μορφή;
Lecturer
Lecturer
_id
Lecturer_surnam
e
Lecturer_name City
salary
Course
_id
Course
_name
Course
Course_id
course_name
Drop database if exists my_training;
CREATE DATABASE my_training;
USE my_training;
CREATE TABLE lecturer(lecturer_id int(3),
lecturer_surname varchar(15), lecturer_name varchar(15),
city varchar(15), salary decimal (8,2), course_id int, course_name varchar(15));
CREATE TABLE course(course_id int, course_name varchar(50));
INSERT INTO course VALUES (1, 'DATABASE');
INSERT INTO course VALUES (2, 'WEB DEVELOPMENT');
INSERT INTO course VALUES (3, 'DATA MINING');
INSERT INTO course VALUES (4, 'SEMANTIC WEB');
Select * From COURSE;
INSERT INTO lecturer(lecturer_id, lecturer_name, lecturer_surname, city, salary,
course_id) VALUES (1, 'CHRIS', 'DATE', 'LONDON', 2000, 1), (2, 'GIO',
'WIEDERHOLD', 'ATHENS', 1500, 1), (3, 'PETER', 'CHEN', 'ATHENS', 3500, 2), (4,
'JEFF', 'ULLMAN', 'ATHENS', 1700, 1), (5, 'TED', 'CODD', 'ATHENS', 2500, 2);
SELECT * FROM lecturer;
Χρήση functions
Γράψε συνάρτηση hello_message που καλείται και δείχνει τη λέξη Hello και μήνυμα.
Για παράδειγμα: Select hello_message('GREECE');
Hello GREECE
DROP FUNCTION IF EXISTS hello_message;
DELIMITER $$
CREATE FUNCTION hello_message(message TEXT)
RETURNS TEXT
BEGIN
RETURN CONCAT('Hello ', message);
END;
$$
DELIMITER ;
Select hello_message('GREECE');
Χρησιμοποίησε μια τοπική μεταβλητή για να κάνεις κάποιους
υπολογισμούς μέσα στη συνάρτησή σου.
DROP FUNCTION IF EXISTS hello_message;
DELIMITER $$
CREATE FUNCTION hello_message(message TEXT)
RETURNS TEXT
BEGIN
DECLARE string_length INT;
SET string_length = LENGTH(message);
RETURN CONCAT('Hello ', message, ' - your message has ', string_length, '
characters');
END;
$$
DELIMITER ;
σελ | 2
Select hello_message('GREECE');
Τοπικές μεταβλητές για υπολογισμούς μέσα σε procedure
DROP PROCEDURE my_procedure_Local_Variables;
DELIMITER $$
CREATE PROCEDURE my_procedure_Local_Variables()
BEGIN
SET @x = 25;
SET @y = 10;
SELECT @x, @y, @x*@y;
END $$
DELIMITER ;
CALL my_procedure_Local_Variables();
Ορισμός trigger για τη διαχείριση τιμής στήλης (salary)
drop trigger if exists bi_lecturer;
DELIMITER //
create trigger bi_lecturer before insert on lecturer for each row
Begin
declare name_l int;
set name_l = length(new.lecturer_name);
set new.salary = new.salary + (new.salary * name_l)/10;
end;
//
DELIMITER ;
SELECT lecturer_id, lecturer_surname, lecturer_name, salary, course_id
from lecturer;
σελ | 3
σελ | 4
Ορισμός trigger για τη διαχείριση τιμής στήλης
(course_name)
drop trigger if exists bi_lecturer;
DROP TRIGGER IF EXISTS bi_lect_add_dname;
DELIMITER //
create trigger bi_lect_add_dname
before insert on lecturer
for each row
begin
declare dname_var varchar(40);
select course_name into dname_var from course where course_id =
new.course_id;
set new.course_name = dname_var;
end;
//
DELIMITER ;
DELETE FROM COURSE;
DELETE FROM LECTURER;
INSERT INTO course VALUES (1, 'DATABASE');
INSERT INTO course VALUES (2, 'WEB DEVELOPMENT');
INSERT INTO course VALUES (3, 'DATA MINING');
INSERT INTO course VALUES (4, 'SEMANTIC WEB');
Select * From COURSE;
INSERT INTO lecturer(lecturer_id, lecturer_name, lecturer_surname, city, salary,
course_id) VALUES (1, 'CHRIS', 'DATE', 'LONDON', 2000, 1), (2, 'GIO',
'WIEDERHOLD', 'ATHENS', 1500, 1), (3, 'PETER', 'CHEN', 'ATHENS', 3500, 2), (4,
'JEFF', 'ULLMAN', 'ATHENS', 1700, 1), (5, 'TED', 'CODD', 'ATHENS', 2500, 2);
SELECT * FROM lecturer;
SELECT lecturer_id, lecturer_surname, lecturer_name, course_id, course_name
from lecturer;
Χρήση triggers
Δημιουργήστε trigger που συνδέεται με πίνακα λογαριασμού και προσθέτει
τις τιμές που εισάγονται (δηλώσεις INSERT) σαν ποσά σε λογαριαμούς.
DROP TABLE IF EXISTS accounts;
CREATE TABLE accounts (acct_num INT, amount DECIMAL(12,2));
CREATE TRIGGER calc_sum
BEFORE INSERT ON accounts
FOR EACH ROW
SET @sum = @sum + NEW.amount;
Δοκιμή
SET @sum = 0;
INSERT INTO accounts VALUES(100,1000.50),(101, 2000.50),(102, -1500.00);
σελ | 5
SELECT @sum AS 'Total amount';
Χρήση functions - Ορισμός συνάρτησης για τη διαχείριση
Cursor
DELIMITER //
CREATE FUNCTION lecturer_list() RETURNS VARCHAR(255)
BEGIN
DECLARE record_not_found INTEGER DEFAULT 0;
DECLARE lecturer_name_var VARCHAR(150) DEFAULT "";
DECLARE lecturer_surname_var VARCHAR(150) DEFAULT "";
DECLARE lect_list VARCHAR(255) DEFAULT "";
DECLARE my_cursor CURSOR FOR SELECT lecturer_name, lecturer_surname
FROM lecturer;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET record_not_found = 1;
OPEN my_cursor;
allLecturers: LOOP
FETCH my_cursor INTO lecturer_name_var, lecturer_surname_var;
IF record_not_found THEN
LEAVE allLecturers;
END IF;
SET lect_list = CONCAT(lect_list, lecturer_surname_var, ", ");
END LOOP allLecturers;
CLOSE my_cursor;
RETURN SUBSTR(lect_list, 1, 70);
END //
σελ | 6
DELIMITER ;
-- Execute function
SELECT lecturer_list();
σελ | 7
Διαχείριση δοσοληψιών στο προϊόν mySQL – Επίπεδα
απομόνωσης (Transactions – Isolation levels)
Προσοχή το προϊόν της mySQL λειτουργεί όταν συνδεθούμε σε
AUTOCOMMIT mode.
DROP DATABASE IF EXISTS MyTestDB;
CREATE DATABASE MyTestDB;
use MyTestDB;
Το προκαθορισμένο (default) isolation level στη MySQL είναι το
REPEATABLE READ:
SELECT @@GLOBAL.tx_isolation, @@tx_isolation;
Αρχικοποίηση του πίνακα Accounts table
USE myTestDB;
DROP TABLE IF EXISTS Accounts;
CREATE TABLE Accounts (
acctID INTEGER NOT NULL PRIMARY KEY,
balance INTEGER NOT NULL,
CONSTRAINT remains_nonnegative CHECK (balance >= 0)
);
INSERT INTO Accounts (acctID,balance) VALUES (101,1000);
INSERT INTO Accounts (acctID,balance) VALUES (202,2000);
SELECT * FROM Accounts;
COMMIT;
σελ | 8
Ανταγωνισμός σε δύο “resources” με διαφορετική σειρά
UPDATE-UPDATE competition on two resources in different orderDELETE FROM Accounts;
INSERT INTO Accounts (acctID,balance) VALUES (101,1000);
INSERT INTO Accounts (acctID,balance) VALUES (202,2000);
SELECT * FROM Accounts;
COMMIT WORK;
S Session A
te
p
1
Session B
USE myTestDB;
SET AUTOCOMMIT=0;
SET TRANSACTION
ISOLATION LEVEL
READ COMMITTED;
UPDATE Accounts
SET balance = balance - 100
WHERE acctID = 101;
2
USE myTestDB;
SET AUTOCOMMIT=0;
SET TRANSACTION ISOLATION
LEVEL
READ COMMITTED;
UPDATE Accounts
SET balance = balance -200
WHERE acctID = 202;
3
UPDATE Accounts -- wait
SET balance = balance+100
WHERE acctID = 202;
4
UPDATE Accounts -- deadlock found
SET balance = balance + 200
WHERE acctID = 101;
5
COMMIT;
SELECT acctID, balance
FROM Accounts
WHERE acctID = 101;
COMMIT;
SELECT acctID, balance
FROM Accounts
WHERE acctID = 101;
σελ | 9
Session A
σελ | 10
Session B
Το Επίπεδο απομόνωσης δεν παίζει κάποιο ρόλο σε αυτό το σενάριο, αλλά
είναι μια καλή πρακτική ο καθορισμός επίπεδου απομόνωσης στην αρχή κάθε
συναλλαγής!
© Copyright 2026 Paperzz