-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathweek12.sql
More file actions
200 lines (161 loc) · 3.58 KB
/
week12.sql
File metadata and controls
200 lines (161 loc) · 3.58 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
-- PSQL Functions
CREATE FUNCTION inc(cnt INTEGER)
RETURNS INTEGER AS $$
BEGIN
RETURN cnt + 1;
END $$ LANGUAGE PLPGSQL; -- 'plpgsql'
SELECT inc(2);
CREATE OR REPLACE FUNCTION my_sum(
IN a NUMERIC,
IN b NUMERIC)
RETURNS NUMERIC AS $$
BEGIN
RETURN a + b;
END;
$$ LANGUAGE PLPGSQL;
SELECT my_sum(2.4, 10);
CREATE OR REPLACE FUNCTION my_max_min(
IN a NUMERIC,
IN b NUMERIC,
IN c NUMERIC,
OUT my_max NUMERIC,
OUT my_min NUMERIC)
AS $$
BEGIN
my_max := GREATEST(a, b, c);
my_min := least(a, b, c);
END;
$$ LANGUAGE plpgsql;
SELECT my_max_min(10, 4, 32);
SELECT *
FROM my_max_min(10, 4, 32);
CREATE FUNCTION square(
INOUT a NUMERIC
) AS $$
BEGIN
a := a * a;
END;
$$ LANGUAGE plpgsql;
SELECT square(12);
CREATE FUNCTION my_sum(
VARIADIC nums NUMERIC [],
OUT total_sum NUMERIC
) AS $$
BEGIN
SELECT INTO total_sum sum(nums [i])
FROM generate_subscripts(nums, 1) i;
END;
$$ LANGUAGE plpgsql;
SELECT *
FROM my_sum(2, 3, 4, 5);
SELECT *
FROM orders;
SELECT
o.order_id,
o.order_status,
o.order_date,
c.first_name || ' ' || c.last_name AS full_name,
oi.total_price
FROM orders AS o
JOIN customers AS c ON o.customer_id = c.customer_id
JOIN (
SELECT
order_id,
sum(list_price * quantity * (1 - discount))
AS total_price
FROM order_items
GROUP BY order_id
) AS oi ON oi.order_id = o.order_id
ORDER BY order_id;
CREATE OR REPLACE FUNCTION get_total_by_customer(
user_id INTEGER
)
RETURNS NUMERIC AS $$
DECLARE
total_orders_price NUMERIC;
BEGIN
SELECT INTO total_orders_price sum(oi.total_price)
FROM orders AS o
JOIN (
SELECT
order_id,
sum(list_price * quantity * (1 - discount))
AS total_price
FROM order_items
GROUP BY order_id
) AS oi ON oi.order_id = o.order_id
WHERE customer_id = user_id;
RETURN total_orders_price;
END;
$$ LANGUAGE plpgsql;
SELECT *
FROM orders;
-- 259 523 175
SELECT get_total_by_customer(523);
CREATE OR REPLACE FUNCTION get_total_by_customer(
user_id INTEGER,
s_id INTEGER
)
RETURNS NUMERIC AS $$
DECLARE
total_orders_price NUMERIC;
BEGIN
SELECT INTO total_orders_price sum(oi.total_price)
FROM orders AS o
JOIN (
SELECT
order_id,
sum(list_price * quantity * (1 - discount))
AS total_price
FROM order_items
GROUP BY order_id
) AS oi ON oi.order_id = o.order_id
WHERE customer_id = user_id AND store_id = s_id;
RETURN total_orders_price;
END;
$$ LANGUAGE plpgsql;
DROP FUNCTION get_total_by_customer( INTEGER );
SELECT get_total_by_customer(259, 1);
SELECT *
FROM products;
DROP FUNCTION get_products( VARCHAR );
CREATE OR REPLACE FUNCTION get_products(p_pattern VARCHAR)
RETURNS TABLE(
id INTEGER,
title VARCHAR,
price NUMERIC
)
AS $$
BEGIN
RETURN QUERY SELECT
product_id,
product_name,
list_price
FROM
products
WHERE
product_name ILIKE p_pattern;
END; $$
LANGUAGE 'plpgsql';
SELECT *
FROM products;
SELECT *
FROM get_products('S%');
CREATE OR REPLACE FUNCTION show()
RETURNS VOID AS $$
<< block1 >>
DECLARE
cnt INTEGER := 0;
BEGIN
cnt := cnt + 1;
RAISE NOTICE 'block1 cnt value = %', cnt;
DECLARE
cnt INTEGER := 0;
BEGIN
cnt := cnt + 10;
RAISE NOTICE 'cnt value in sub block = %', cnt;
RAISE NOTICE 'cnt value in from block1 = %', block1.cnt;
END;
END block1;
$$ LANGUAGE plpgsql;
SELECT show();