mirror of
https://github.com/ada-dmitry/DB.mephi_ada.git
synced 2026-09-23 23:50:16 +00:00
105 lines
2.3 KiB
PL/PgSQL
105 lines
2.3 KiB
PL/PgSQL
-- Task 1 --
|
|
|
|
CREATE OR REPLACE PROCEDURE molodec() AS $$
|
|
DECLARE
|
|
name1 varchar := 'Julia';
|
|
name2 varchar := 'Пустотааа';
|
|
BEGIN
|
|
RAISE INFO ' %, %, вы молодцы! ', name1, name2;
|
|
|
|
END $$ LANGUAGE plpgsql;
|
|
CALL molodec();
|
|
|
|
-- Task 2 --
|
|
|
|
CREATE OR REPLACE PROCEDURE fiiiizika() AS $$
|
|
DECLARE
|
|
velocity_kmh NUMERIC := 60;
|
|
time_seconds NUMERIC := 30;
|
|
velocity_ms NUMERIC;
|
|
distance_m NUMERIC;
|
|
train_length_m NUMERIC;
|
|
BEGIN
|
|
|
|
velocity_ms := velocity_kmh * 1000 / 3600;
|
|
|
|
distance_m := velocity_ms * time_seconds;
|
|
train_length_m := distance_m;
|
|
|
|
RAISE INFO ' % ', TRUNC(train_length_m);
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
CALL fiiiizika();
|
|
|
|
|
|
|
|
-- Task 3 --
|
|
|
|
CREATE OR REPLACE PROCEDURE show_city_streets() AS $$
|
|
DECLARE
|
|
city_record RECORD;
|
|
BEGIN
|
|
FOR city_record IN SELECT city, street_address FROM locations
|
|
LOOP
|
|
RAISE NOTICE 'В городе % есть улица %',
|
|
city_record.city, city_record.street_address;
|
|
END LOOP;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
CALL show_city_streets();
|
|
|
|
|
|
-- Task 4 --
|
|
|
|
CREATE OR REPLACE PROCEDURE factorial(n INTEGER) AS $$
|
|
DECLARE
|
|
result INTEGER := 1;
|
|
i INTEGER := 1;
|
|
BEGIN
|
|
WHILE i <= n LOOP
|
|
result := result * i;
|
|
i := i + 1;
|
|
END LOOP;
|
|
RAISE INFO ' % ', result;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
CALL factorial(10);
|
|
|
|
-- Task 5 --
|
|
|
|
CREATE OR REPLACE FUNCTION get_employees_and_managers_names()
|
|
RETURNS TABLE (employee_name TEXT, manager_name TEXT) AS $$
|
|
BEGIN
|
|
RETURN QUERY
|
|
SELECT e.first_name || ' ' || e.last_name AS employee_name,
|
|
COALESCE(m.first_name || ' ' || m.last_name, 'No manager') AS manager_name
|
|
FROM employees e
|
|
LEFT JOIN employees m ON e.manager_id = m.employee_id;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
SELECT get_employees_and_managers_names();
|
|
|
|
-- Task 6 --
|
|
|
|
CREATE OR REPLACE FUNCTION binary_to_decimal(binary_num VARCHAR)
|
|
RETURNS NUMERIC AS $$
|
|
DECLARE
|
|
decimal_num NUMERIC := 0;
|
|
power NUMERIC := 0;
|
|
bit NUMERIC;
|
|
BEGIN
|
|
FOR i IN REVERSE 1..LENGTH(binary_num) LOOP
|
|
bit := CAST(SUBSTRING(binary_num FROM i FOR 1) AS NUMERIC);
|
|
decimal_num := decimal_num + (bit * (2 ^ power));
|
|
power := power + 1;
|
|
END LOOP;
|
|
RETURN decimal_num;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
SELECT binary_to_decimal('101');
|
|
|