Разбор домашнего задания
--Создать функцию (ручной вариант coalesce), принимающий 2 аргумента, и возвращающую первый непустой из этих двух аргументов. Функция принимает на вход любые типы данных.
create function cust_coalesce(a1 anyelement, a2 anyelement) returns anyelement
as $$
select
case
when a1 is not null
then a1
else
a2
end;
$$
language sql;select
cust_coalesce(1, 2),
cust_coalesce(null, 3),
cust_coalesce(4, null);
--Создать функцию как в первом пункте, но принимающую 3 параметра.
create function cust_coalesce(a1 anyelement, a2 anyelement, a3 anyelement) returns anyelement
as $$
select
case
when a1 is not null then a1
when a2 is not null then a2
else a3
end;
$$ language sql;
select
cust_coalesce(null, 1, 2),
cust_coalesce(null, 3, null),
cust_coalesce(4, null, null);
--Пересоздать функцию из пункта 2, используя create or replace, добавив в ее тело комментарии, поясняющие логику выполнения.
create or replace function cust_coalesce(a1 anyelement, a2 anyelement, a3 anyelement) returns anyelement
as $$
select
case
-- если первый параметр не пустой, о возвращаем его
when a1 is not null then a1
-- если второй не пустой - возвращаем его
when a2 is not null then a2
-- иначе возвращаем третий параметр
else a3
end;
$$ language sql;
--Создать таблицу с одним вещественным полем. Создать процедуру, которая заполняет созданную таблицу случайными вещественными числами от 0 до 1.
--Процедура должна принимать на вход одно целое число - количество элементов, которое надо вставить в таблицу.
--Процедура должна вернуть среднее значение из всех элементов в таблице.
create table g(
g float
)
select * from g;
create or replace procedure fill_g(in num_el integer, inout avg_val float)
as $$
insert into g
select
random()
from
generate_series(1, num_el);
select
avg(g)
from
g;
$$ language sql;
call fill_g(10, null);
select * from g;
--* Создать процедуру, которая будет наполнять таблицу rental новыми записями.
--Принимает параметры:
--- nm integer - число строк, которое нужно добавить
--- dt date default null - дата rental_date, за которую нужно добавить новые записи. Если дата не задана, то находим максимальную существующую дату rental_date в таблице rental и прибавляем к ней один день.
--Компакт диски для сдачи выбираем случайным образом.
create procedure fill_rent(nm integer, dt date default null)
as $$
insert into rental (
rental_date,
inventory_id,
customer_id,
return_date,
staff_id
)
select
subquery.rental_date,
subquery.inventory_id,
subquery.customer_id,
subquery.rental_date + (
select
f.rental_duration
from
film f
join inventory i using (film_id)
where
i.inventory_id = subquery.inventory_id
) as return_date,
subquery.staff_id
from
(
select
coalesce(dt, (select max(rental_date)::date + 1 from rental)) rental_date,
(
select
floor(rand.rand * count(*)) + 1
from
inventory
) inventory_id,
(
select
floor(rand.rand * count(*)) + 1
from
customer
) customer_id,
(
select
floor(rand.rand * count(*)) + 1
from
staff
) staff_id
from
(
select
random() rand
from
generate_series(1, nm)
) rand
) subquery;
$$ language sql;
call fill_rent(10, null);