Функции в PostgreSQL. Проектирование структуры БД хоккейной лиги, страница 2

            salary INT CHECK(salary >= 0) NOT NULL DEFAULT 0,

            bonus INT CHECK(bonus >= 0) NOT NULL DEFAULT 0,

            penalty INT CHECK(penalty >= 0) NOT NULL DEFAULT 0,

            CONSTRAINT team_num UNIQUE(team_id, num)

);

--Таблица игр. При удалении одной из играющих команд из таблицы teams, записи об

--играх этой команды удаляются из таблицы games. Играющие команды не могут

--совпадать

CREATE TABLE games

(

            game_id SERIAL PRIMARY KEY,

            day DATE NOT NULL,

            city_id INT NOT NULL REFERENCES city ON DELETE RESTRICT,

            team1_id INT NOT NULL REFERENCES teams ON DELETE CASCADE,

            team2_id INT NOT NULL REFERENCES teams ON DELETE CASCADE,

            resources INT NOT NULL CHECK(resources >= 0) DEFAULT 0,

            tickets_price INT NOT NULL CHECK(tickets_price >= 0) DEFAULT 0,

            tickets INT NOT NULL CHECK(tickets >= 0) DEFAULT 0,

            sold_tickets INT NOT NULL CHECK(sold_tickets >= 0) DEFAULT 0,

            CONSTRAINT teams CHECK(team1_id != team2_id),

            CONSTRAINT tickets CHECK(sold_tickets <= tickets)

);

--Таблицастатистики игр. Содержит число голов, голевых пасов и т.п. каждого игрока

--для каждой игры. При удалении игры из таблицы games, статистика игроков в этой

--игре также удаляется из таблицы stats

CREATE TABLE stats

(

            game_id INT NOT NULL REFERENCES games ON DELETE CASCADE,

            player_id INT NOT NULL REFERENCES players ON DELETE CASCADE,

            goals INT NOT NULL CHECK(goals >= 0) DEFAULT 0,

            assists INT NOT NULL CHECK(assists >= 0) DEFAULT 0,

            game_time INT NOT NULL CHECK(game_time >= 0) DEFAULT 0,

            penalty_time INT NOT NULL CHECK(penalty_time >= 0) DEFAULT 0

);

--Добавление города

--Параметры: название города

CREATE OR REPLACE FUNCTION add_city(VARCHAR(20))

RETURNS CHAR

AS '

            DECLARE id INT;

            BEGIN

                        INSERT INTO city(name) VALUES(upper($1))

                        RETURNING city_id INTO id;

                        INSERT INTO log VALUES(DEFAULT, ''add_city'', now());

                        RETURN ''city_id = '' || id;

            END;

' LANGUAGE 'plpgsql';

--Удаление города

--Параметры: название города

CREATE OR REPLACE FUNCTION remove_city(VARCHAR(20))

RETURNS CHAR

AS '

            BEGIN

                        DELETE FROM city WHERE name = upper($1);

                        IF NOT FOUND THEN

                                    RETURN ''city = '' || $1 || '' does not exist!'';

                        END IF;

                        INSERT INTO log VALUES(DEFAULT, ''remove_city'', now());

                        RETURN ''Done!'';

            END;

' LANGUAGE 'plpgsql';

--Добавление команды

--Параметры: название команды, название города

CREATE OR REPLACE FUNCTION add_team(VARCHAR(20), VARCHAR(20))

RETURNS CHAR

AS '

            DECLARE id INT;

            BEGIN

                        SELECT city_id INTO id FROM city WHERE name = upper($2);

                        IF NOT FOUND THEN

                                    RETURN ''city = '' || $2 || '' does not exist!'';

                        END IF;

                        INSERT INTO teams(name, city_id) VALUES(upper($1), id)

                        RETURNING team_id INTO id;

                        INSERT INTO log VALUES(DEFAULT, ''add_team'', now());

                        RETURN ''team_id = '' || id;

            END;

' LANGUAGE 'plpgsql';

--Изменение команды

--Параметры: id команды, новое название, название города

CREATE OR REPLACE FUNCTION edit_team(INT, VARCHAR(20), VARCHAR(20))

RETURNS CHAR

AS '

            DECLARE id INT;

            BEGIN