PostgreeSQL: добавление функций
Часто чтобы не плодить логику в приложении, проще часть функционала по вычислению чего-либо возложить на сервер БД. Для этого и нужны функции. Причем в Postgree мне они понравились много больше чем в MySQL в плане простоты и удобства.
Любая функция в PostgreeSQL начинается с объявления функции, перечисления используемых переменных, тела функции и в конце возврат результата выполнения функции.
Объявление функции:
CREATE OR REPLACE FUNCTION public.get_calculate_station_status(
station_id integer) -- на входе параметр station_id - число
RETURNS integer -- возвращает число
LANGUAGE 'plpgsql' -- язык
plpgsql
AS $BODY$
Объявление переменных, идет после команды DECLARE. перечисляются заранее все переменные с указанием их типов, которые будут использоваться внутри функции. Например:
DECLARE
status integer; — число
st_online boolean; — true/false
stations integer[]; — массив чисел
Сама функция пишется непосредственно между BEGIN и END; Доступны элементарные условия:
IF aa=bb THEN
bb:=1;
ELSE
cc:=2;
END IF;
Поместить результат запроса в переменную или в массив:
select zz from xx into aa where vv=1;
Перебор массива:
FOREACH st_id IN ARRAY stations
LOOP
connectors_free:=connectors_free+get_count_connectors_free(st_id);
stations_online:=stations_online+1;
END LOOP;
Результирующий пример готовой функции:
DECLARE
status integer;
stations integer[];
connectors_free integer;
stations_online integer;
st_id integer;
BEGIN
status:=get_ezs_status(ezs_id);
if status=1 THEN
connectors_free:=0;
stations_online:=0;
stations:=ARRAY (select station from stations_online inner join stations on stations.id=station where stations.ezs=ezs_id and stations.status=1 and deleted=false);
FOREACH st_id IN ARRAY stations
LOOP
connectors_free:=connectors_free+get_count_connectors_free(st_id);
stations_online:=stations_online+1;
END LOOP;
IF stations_online>0 THEN
if connectors_free>0 THEN
status:=1;
ELSE
status:=4;
END IF;
ELSE
status:=5;
END IF;
END IF;
return status;
END;





