Skip to content

Commit 3d5e38b

Browse files
committed
stored procedures and functions
1 parent ab3aeb6 commit 3d5e38b

File tree

1 file changed

+236
-0
lines changed

1 file changed

+236
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,236 @@
1+
/**************************************/
2+
/* Stored Procedures */
3+
/**************************************/
4+
DELIMITER $$
5+
CREATE PROCEDURE get_clients()
6+
BEGIN
7+
SELECT * FROM clients;
8+
END $$
9+
DELIMITER ;
10+
11+
/**************************************/
12+
/* Call Stored Procedures */
13+
/**************************************/
14+
CALL get_clients();
15+
16+
17+
/* get_invoices_with_balance to return all the invoices with balance > 0 */
18+
DROP PROCEDURE IF EXISTS get_invoices_with_balance;
19+
20+
DELIMITER $$
21+
CREATE PROCEDURE get_invoices_with_balance()
22+
BEGIN
23+
SELECT *
24+
FROM invoices
25+
WHERE (invoice_total - payment_total) > 0;
26+
END $$
27+
DELIMITER ;
28+
29+
CALL get_invoices_with_balance();
30+
31+
/**************************************/
32+
/* DROP Stored Procedures */
33+
/**************************************/
34+
35+
DROP PROCEDURE IF EXISTS get_clients;
36+
37+
38+
/**************************************/
39+
/* Parameters */
40+
/**************************************/
41+
DROP PROCEDURE IF EXISTS get_client_by_state;
42+
43+
DELIMITER $$
44+
CREATE PROCEDURE get_client_by_state(p_state CHAR(2))
45+
BEGIN
46+
SELECT * FROM clients
47+
WHERE state = p_state;
48+
END $$
49+
DELIMITER ;
50+
51+
CALL get_client_by_state('NY');
52+
53+
54+
/* exercise */
55+
/* return invoices for a given client */
56+
57+
DROP PROCEDURE IF EXISTS get_invoices_by_client;
58+
59+
DELIMITER $$
60+
CREATE PROCEDURE get_invoices_by_client(p_client_name VARCHAR(50))
61+
BEGIN
62+
SELECT * FROM invoices i
63+
JOIN clients c ON c.client_id = i.invoice_id
64+
WHERE c.name = p_client_name;
65+
END $$
66+
DELIMITER ;
67+
68+
CALL get_invoices_by_client('Myworks');
69+
70+
/**************************************/
71+
/* Parameters with DEFAULT values */
72+
/**************************************/
73+
74+
-- set the state to CA if there is no parameters given
75+
76+
DROP PROCEDURE IF EXISTS get_client_by_state;
77+
78+
DELIMITER $$
79+
CREATE PROCEDURE get_client_by_state(p_state CHAR(2))
80+
BEGIN
81+
IF p_state IS NULL THEN
82+
SET p_state = 'CA';
83+
END IF;
84+
85+
SELECT * FROM clients
86+
WHERE state = p_state;
87+
END $$
88+
DELIMITER ;
89+
90+
CALL get_client_by_state(NULL);
91+
92+
-- get all clients, if there is no parameters given
93+
94+
DROP PROCEDURE IF EXISTS get_client_by_state;
95+
96+
DELIMITER $$
97+
CREATE PROCEDURE get_client_by_state(p_state CHAR(2))
98+
BEGIN
99+
SELECT * FROM clients
100+
WHERE state = IFNULL(p_state, state);
101+
END $$
102+
DELIMITER ;
103+
104+
CALL get_client_by_state(NULL);
105+
106+
/* Exercise */
107+
/*stored procedure get_payments with two parameters
108+
client_id INT(4),
109+
payment_method_id TINYINT(1) => 0-255
110+
111+
parameters are optional and if not given, get all info
112+
*/
113+
DROP PROCEDURE IF EXISTS get_payments;
114+
115+
DELIMITER $$
116+
CREATE PROCEDURE get_payments(p_client_id INT(4), p_payment_method_id TINYINT(1))
117+
BEGIN
118+
SELECT * FROM payments
119+
WHERE client_id = IFNULL(p_client_id, client_id)
120+
AND payment_method = IFNULL(p_payment_method_id, payment_method);
121+
END $$
122+
DELIMITER ;
123+
124+
CALL get_payments(5,2);
125+
CALL get_payments(5,NULL);
126+
CALL get_payments(NULL,1);
127+
CALL get_payments(NULL,NULL);
128+
129+
130+
/**************************************/
131+
/* Parameters Validation */
132+
/**************************************/
133+
DROP PROCEDURE IF EXISTS make_payment;
134+
135+
DELIMITER $$
136+
CREATE PROCEDURE make_payment(invoice_id INT, payment_amount DECIMAL(9,2), payment_date DATE)
137+
BEGIN
138+
IF payment_amount <= 0 THEN
139+
SIGNAL SQLSTATE '22003'
140+
SET MESSAGE_TEXT = 'Invalid Payment Amount';
141+
END IF;
142+
143+
UPDATE invoices i
144+
SET i.invoice_amount = payment_amount,
145+
i.payment_date = payment_date
146+
WHERE i.invoice_id = invoice_id;
147+
END $$
148+
DELIMITER ;
149+
150+
-- Testing
151+
CALL mosh_sql_invoicing.make_payment(1, -345, '2020-05-01');
152+
153+
154+
/**************************************/
155+
/* Output Parameters */
156+
/**************************************/
157+
158+
/*get unpaid invoices for a client */
159+
DROP PROCEDURE IF EXISTS get_unpaid_invoices_for_client;
160+
161+
DELIMITER $$
162+
CREATE PROCEDURE get_unpaid_invoices_for_client(client_id INT, OUT number_of_unpaid_invoices INT, OUT total_unpaid_amount INT)
163+
BEGIN
164+
SELECT COUNT(*), SUM(invoice_total)
165+
INTO number_of_unpaid_invoices, total_unpaid_amount
166+
FROM invoices i
167+
WHERE i.client_id = client_id
168+
AND payment_total = 0;
169+
END $$
170+
DELIMITER ;
171+
172+
-- testing
173+
set @number_of_unpaid_invoices = 0;
174+
set @total_unpaid_amount = 0;
175+
call mosh_sql_invoicing.get_unpaid_invoices_for_client(3, @number_of_unpaid_invoices, @total_unpaid_amount);
176+
select @number_of_unpaid_invoices, @total_unpaid_amount;
177+
178+
179+
/**************************************/
180+
/* Variables */
181+
/**************************************/
182+
183+
-- User or Session Variables
184+
set @total_unpaid_amount = 0;
185+
186+
-- Local Variables
187+
DELIMITER $$
188+
CREATE PROCEDURE get_risk_factor()
189+
BEGIN
190+
DECLARE risk_factor DECIMAL(9,2) DEFAULT 0;
191+
DECLARE invoices_total DECIMAL(9,2);
192+
DECLARE invoice_count INT;
193+
194+
SELECT COUNT(*), SUM(invoice_total)
195+
INTO invoices_total, invoice_count
196+
FROM invoices;
197+
198+
SET risk_factor = invoices_total / invoice_count * 5;
199+
200+
SELECT risk_factor;
201+
END $$
202+
DELIMITER ;
203+
204+
205+
CALL get_risk_factor();
206+
207+
/***********************************************************/
208+
209+
/**************************************/
210+
/* Functions */
211+
/**************************************/
212+
DROP FUNCTION IF EXISTS func_get_risk_factor_for_client;
213+
214+
DELIMITER $$
215+
CREATE FUNCTION func_get_risk_factor_for_client(client_id INT)
216+
RETURNS INTEGER
217+
READS SQL DATA
218+
BEGIN
219+
DECLARE risk_factor DECIMAL(9,2) DEFAULT 0;
220+
DECLARE invoices_total DECIMAL(9,2);
221+
DECLARE invoice_count INT;
222+
223+
SELECT COUNT(*), SUM(invoice_total)
224+
INTO invoices_total, invoice_count
225+
FROM invoices i
226+
WHERE i.client_id = client_id;
227+
228+
SET risk_factor = invoices_total / invoice_count * 5;
229+
230+
RETURN IFNULL(risk_factor,0);
231+
END $$
232+
DELIMITER ;
233+
234+
-- Testing
235+
SELECT client_id, name, func_get_risk_factor_for_client(client_id) AS risk_factor
236+
FROM clients;

0 commit comments

Comments
 (0)