PostgreeSQL: добавление функций
Часто чтобы не плодить логику в приложении, проще часть функционала по вычислению чего-либо возложить на сервер БД. Для этого и нужны функции. Причем в Postgree мне они понравились много больше чем в MySQL в плане простоты и удобства.
Любая функция в PostgreeSQL начинается с объявления функции, перечисления используемых переменных, тела функции и в конце возврат результата выполнения функции.
Объявление функции:
| 1 2 3 4 5 6 | 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; Доступны элементарные условия:
| 1 2 3 4 5 6 |  IF aa=bb THEN        bb:=1;     ELSE        cc:=2; END IF; | 
Поместить результат запроса в переменную или в массив:
| 1 | select zz from xx into aa where vv=1; | 
Перебор массива:
| 1 2 3 4 5 | FOREACH st_id IN ARRAY stations     LOOP        connectors_free:=connectors_free+get_count_connectors_free(st_id); 	   stations_online:=stations_online+1;     END LOOP; | 
Результирующий пример готовой функции:
| 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 | 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; | 





