-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path05_Stored_Procedures.sql
More file actions
173 lines (146 loc) · 4.54 KB
/
05_Stored_Procedures.sql
File metadata and controls
173 lines (146 loc) · 4.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
/**************************************************************
* MySQL 8.0 Stored Procedures Tutorial
* Description: This script demonstrates creating stored
* procedures in MySQL for basic lookups, output
* parameters, JSON input, error handling, and
* transactional updates.
**************************************************************/
-------------------------------------------------
-- Region: 0. Initialization
-------------------------------------------------
USE mysql_course;
DROP TABLE IF EXISTS animals;
CREATE TABLE animals
(
animal_id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(60) NOT NULL,
animal_type VARCHAR(60) NOT NULL,
age INT NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uq_animals_name (name)
) ENGINE = InnoDB;
INSERT INTO animals (name, animal_type, age)
VALUES
('Leo', 'Mammal', 5),
('Polly', 'Bird', 2),
('Nemo', 'Fish', 1);
DROP PROCEDURE IF EXISTS GetAnimalByName;
DROP PROCEDURE IF EXISTS AddAnimal;
DROP PROCEDURE IF EXISTS GetAnimalCountByType;
DROP PROCEDURE IF EXISTS AddAnimalFromJSON;
DROP PROCEDURE IF EXISTS TransferAnimal;
DELIMITER //
-------------------------------------------------
-- Region: 1. Simple Stored Procedure
-------------------------------------------------
/*
1.1 GetAnimalByName: Returns animal information for one name.
*/
CREATE PROCEDURE GetAnimalByName(IN p_name VARCHAR(60))
BEGIN
SELECT animal_id, name, animal_type, age
FROM animals
WHERE name = p_name;
END //
-------------------------------------------------
-- Region: 2. Procedure with Error Handling
-------------------------------------------------
/*
2.1 AddAnimal: Inserts a row and returns diagnostics on failure.
*/
CREATE PROCEDURE AddAnimal(
IN p_name VARCHAR(60),
IN p_type VARCHAR(60),
IN p_age INT
)
BEGIN
DECLARE v_sqlstate CHAR(5) DEFAULT '00000';
DECLARE v_errno INT DEFAULT 0;
DECLARE v_message TEXT;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1
v_sqlstate = RETURNED_SQLSTATE,
v_errno = MYSQL_ERRNO,
v_message = MESSAGE_TEXT;
ROLLBACK;
SELECT
v_sqlstate AS sqlstate_value,
v_errno AS mysql_errno,
v_message AS error_message;
END;
START TRANSACTION;
INSERT INTO animals (name, animal_type, age)
VALUES (p_name, p_type, p_age);
COMMIT;
END //
-------------------------------------------------
-- Region: 3. Procedure with Output Parameter
-------------------------------------------------
/*
3.1 GetAnimalCountByType: Returns a count using an OUT parameter.
*/
CREATE PROCEDURE GetAnimalCountByType(
IN p_type VARCHAR(60),
OUT p_count INT
)
BEGIN
SELECT COUNT(*)
INTO p_count
FROM animals
WHERE animal_type = p_type;
END //
-------------------------------------------------
-- Region: 4. Procedure with JSON Input
-------------------------------------------------
/*
4.1 AddAnimalFromJSON: Parses a JSON document and inserts one row.
Expected JSON format:
{"Name": "Kiki", "Type": "Bird", "Age": 3}
*/
CREATE PROCEDURE AddAnimalFromJSON(IN p_animal JSON)
BEGIN
INSERT INTO animals (name, animal_type, age)
VALUES
(
JSON_UNQUOTE(JSON_EXTRACT(p_animal, '$.Name')),
JSON_UNQUOTE(JSON_EXTRACT(p_animal, '$.Type')),
JSON_EXTRACT(p_animal, '$.Age')
);
END //
-------------------------------------------------
-- Region: 5. Transactional Update Procedure
-------------------------------------------------
/*
5.1 TransferAnimal: Changes an animal type with validation.
*/
CREATE PROCEDURE TransferAnimal(
IN p_animal_id INT,
IN p_new_type VARCHAR(60)
)
BEGIN
START TRANSACTION;
UPDATE animals
SET animal_type = p_new_type
WHERE animal_id = p_animal_id;
IF ROW_COUNT() = 0 THEN
ROLLBACK;
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'No animal found with the provided animal_id.';
END IF;
COMMIT;
END //
DELIMITER ;
-------------------------------------------------
-- Region: 6. Example Calls
-------------------------------------------------
CALL GetAnimalByName('Leo');
CALL AddAnimal('Daisy', 'Mammal', 4);
SET @animal_count = 0;
CALL GetAnimalCountByType('Mammal', @animal_count);
SELECT @animal_count AS mammal_count;
CALL AddAnimalFromJSON('{"Name": "Kiki", "Type": "Bird", "Age": 3}');
CALL TransferAnimal(1, 'Big Cat');
-------------------------------------------------
-- Region: End of Script
-------------------------------------------------