-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathstatements.sql
More file actions
211 lines (188 loc) · 4.79 KB
/
statements.sql
File metadata and controls
211 lines (188 loc) · 4.79 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
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
-- IF statement --
-- DO $$
-- DECLARE
-- a integer := 10;
-- b integer := 20;
-- BEGIN
-- IF a > b THEN
-- RAISE NOTICE 'a is greater than b';
-- END IF;
-- IF a < b THEN
-- RAISE NOTICE 'a is less than b';
-- END IF;
-- IF a = b THEN
-- RAISE NOTICE 'a is equal to b';
-- END IF;
-- END; $$
-- IF THEN ELSE statement --
-- DO $$
-- DECLARE
-- a integer := 10;
-- b integer := 20;
-- BEGIN
-- IF a > b THEN
-- RAISE NOTICE 'a is greater than b';
-- ELSE
-- RAISE NOTICE 'a is less than b';
-- END IF;
-- END; $$
-- IF THEN ELSIF THEN ELSE statement --
-- DO $$
-- DECLARE
-- a integer := 10;
-- b integer := 10;
-- BEGIN
-- IF a > b THEN
-- RAISE NOTICE 'a is greater than b';
-- ELSIF a < b THEN
-- RAISE NOTICE 'a is less than b';
-- ELSE
-- RAISE NOTICE 'a is equal to b';
-- END IF;
-- END; $$
-- CASE Statement --
-- CREATE OR REPLACE FUNCTION get_price_segment(p_film_id integer)
-- RETURNS VARCHAR(50) AS $$
-- DECLARE
-- rate NUMERIC;
-- price_segment VARCHAR(50);
-- BEGIN
-- -- get the rate based on film_id
-- SELECT INTO rate rental_rate
-- FROM film
-- WHERE film_id=p_film_id;
-- CASE rate
-- WHEN 0.99 THEN price_segment = 'Mass';
-- WHEN 2.99 THEN price_segment = 'Mainstream';
-- WHEN 4.99 THEN price_segment = 'High end';
-- ELSE
-- price_segment = 'Unspecified';
-- END CASE;
-- RETURN price_segment;
-- END; $$
-- LANGUAGE plpgsql
-- Searched CASE statement --
-- CREATE OR REPLACE FUNCTION get_customer_service(p_customer_id integer)
-- RETURNS VARCHAR(25) AS $$
-- DECLARE
-- total_payment NUMERIC;
-- service_level VARCHAR(25);
-- BEGIN
-- -- get the total_payment based on customer id
-- SELECT INTO total_payment SUM(amount)
-- FROM payment
-- WHERE customer_id = p_customer_id;
-- CASE
-- WHEN total_payment > 200 THEN service_level = 'Platinum';
-- WHEN total_payment > 100 THEN service_level = 'Gold';
-- ELSE
-- service_level = 'Silver';
-- END CASE;
-- RETURN service_level;
-- END; $$
-- LANGUAGE plpgsql
-- LOOP statement --
-- CREATE OR REPLACE FUNCTION fibonacci(n integer)
-- RETURNS INTEGER AS $$
-- DECLARE
-- c INTEGER := 0; -- c
-- i INTEGER := 0;
-- j INTEGER := 1;
-- BEGIN
-- IF (n < 1) THEN
-- RETURN 0;
-- END IF;
-- LOOP
-- EXIT WHEN c = n;
-- c := c + 1;
-- SELECT j, i + j INTO i, j;
-- END LOOP;
-- RETURN i;
-- END; $$
-- LANGUAGE plpgsql
-- WHILE loop --
-- CREATE OR REPLACE FUNCTION fibonacci (n INTEGER)
-- RETURNS INTEGER AS $$
-- DECLARE
-- c INTEGER := 0 ; -- counter
-- i INTEGER := 0 ;
-- j INTEGER := 1 ;
-- BEGIN
-- IF (n < 1) THEN
-- RETURN 0 ;
-- END IF;
-- WHILE c <= n LOOP
-- c := c + 1 ;
-- SELECT j, i + j INTO i, j ;
-- END LOOP ;
-- RETURN i ;
-- END ; $$
-- LANGUAGE plpgsql
-- FOR loop statement --
-- Loop through 1 to 5 and print out a message in each iteration. The counter takes 1, 2, 3, 4, 5
-- DO $$
-- BEGIN
-- FOR counter IN 1..5
-- LOOP
-- RAISE NOTICE 'Counter: %', counter;
-- END LOOP;
-- END; $$
-- Loop through 5 to 1 and print a message in each iteration. The counter takes 5, 4, 3, 2, 1
-- DO $$
-- BEGIN
-- FOR counter IN REVERSE 5..1
-- LOOP
-- RAISE NOTICE 'Counter: %', counter;
-- END LOOP;
-- END; $$
-- Loop through 1 to 6, and print out the counter in each loop iteration. The counter takes 1, 3, 5.
-- In each iteration, PostgreSQL adds 2 to the counter.
-- DO $$
-- BEGIN
-- FOR counter IN 1..6 BY 2
-- LOOP
-- RAISE NOTICE 'Counter: %', counter;
-- END LOOP;
-- END; $$
-- FOR loop for looping through a query result
-- CREATE OR REPLACE FUNCTION for_loop_through_query(
-- n INTEGER DEFAULT 10
-- )
-- RETURNS VOID AS $$
-- DECLARE
-- rec RECORD;
-- BEGIN
-- FOR rec IN SELECT title
-- FROM film
-- ORDER BY title
-- LIMIT n
-- LOOP
-- RAISE NOTICE '%', rec.title;
-- END LOOP;
-- END; $$
-- LANGUAGE plpgsql
-- FOR loop for looping through a query result of a dynamic query
CREATE OR REPLACE FUNCTION for_loop_through_dyn_query(
sort_type INTEGER,
n INTEGER
)
RETURNS VOID AS $$
DECLARE
rec RECORD;
query TEXT;
BEGIN
query := 'SELECT title, release_year FROM film ';
IF sort_type = 1 THEN
query := query || 'ORDER BY title ';
ELSIF sort_type = 2 THEN
query := query || 'ORDER BY release_year ';
ELSE
RAISE EXCEPTION 'Invalid sort_type: %', sort_type;
END IF;
query := query || 'LIMIT $1';
FOR rec IN EXECUTE query USING n
LOOP
RAISE NOTICE '% - %', rec.release_year, rec.title;
END LOOP;
END; $$
LANGUAGE plpgsql