-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path06_Functions.sql
More file actions
133 lines (114 loc) · 3.47 KB
/
06_Functions.sql
File metadata and controls
133 lines (114 loc) · 3.47 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
/**************************************************************
* MySQL 8.0 Functions Tutorial
* Description: This script demonstrates scalar stored functions
* in MySQL. Because MySQL does not support table-
* valued functions, set-returning logic is modeled
* with views, CTEs, or ordinary SELECT statements.
**************************************************************/
-------------------------------------------------
-- Region: 0. Initialization
-------------------------------------------------
USE mysql_course;
DROP FUNCTION IF EXISTS GetAnimalType;
DROP FUNCTION IF EXISTS SafeDivide;
DROP FUNCTION IF EXISTS GetAnimalAgeCategory;
DROP FUNCTION IF EXISTS GetAnimalNamesByType;
DELIMITER //
-------------------------------------------------
-- Region: 1. Simple Scalar Function
-------------------------------------------------
/*
1.1 GetAnimalType: Returns the type of an animal by name.
*/
CREATE FUNCTION GetAnimalType(p_name VARCHAR(60))
RETURNS VARCHAR(60)
READS SQL DATA
BEGIN
DECLARE v_type VARCHAR(60);
SELECT animal_type
INTO v_type
FROM animals
WHERE name = p_name
LIMIT 1;
RETURN v_type;
END //
-------------------------------------------------
-- Region: 2. Safe Arithmetic Function
-------------------------------------------------
/*
2.1 SafeDivide: Returns NULL when the denominator is zero.
*/
CREATE FUNCTION SafeDivide(p_numerator DECIMAL(18, 4), p_denominator DECIMAL(18, 4))
RETURNS DECIMAL(18, 4)
DETERMINISTIC
BEGIN
IF p_denominator = 0 THEN
RETURN NULL;
END IF;
RETURN p_numerator / p_denominator;
END //
-------------------------------------------------
-- Region: 3. CASE-Based Function
-------------------------------------------------
/*
3.1 GetAnimalAgeCategory: Categorizes an age value.
*/
CREATE FUNCTION GetAnimalAgeCategory(p_age INT)
RETURNS VARCHAR(20)
DETERMINISTIC
BEGIN
RETURN CASE
WHEN p_age < 1 THEN 'Infant'
WHEN p_age BETWEEN 1 AND 3 THEN 'Young'
WHEN p_age BETWEEN 4 AND 7 THEN 'Adult'
ELSE 'Senior'
END;
END //
-------------------------------------------------
-- Region: 4. Aggregation Function
-------------------------------------------------
/*
4.1 GetAnimalNamesByType: Aggregates names into one string.
*/
CREATE FUNCTION GetAnimalNamesByType(p_type VARCHAR(60))
RETURNS TEXT
READS SQL DATA
BEGIN
DECLARE v_names TEXT;
SELECT GROUP_CONCAT(name ORDER BY name SEPARATOR ', ')
INTO v_names
FROM animals
WHERE animal_type = p_type;
RETURN v_names;
END //
DELIMITER ;
-------------------------------------------------
-- Region: 5. MySQL Alternative to Table-Valued Functions
-------------------------------------------------
/*
5.1 MySQL functions return scalar values only.
For set-returning logic, use a CTE or a view instead.
*/
WITH animals_older_than_three AS
(
SELECT name, animal_type, age
FROM animals
WHERE age > 3
)
SELECT *
FROM animals_older_than_three;
-------------------------------------------------
-- Region: 6. Example Queries
-------------------------------------------------
SELECT GetAnimalType('Leo') AS animal_type_for_leo;
SELECT SafeDivide(10, 2) AS normal_division,
SafeDivide(10, 0) AS safe_division;
SELECT
name,
age,
GetAnimalAgeCategory(age) AS age_category
FROM animals;
SELECT GetAnimalNamesByType('Bird') AS bird_names;
-------------------------------------------------
-- Region: End of Script
-------------------------------------------------