Напишем функцию, которая добавляет запись в таблицу и возвращает содержимое добавленной записи.
CREATE OR REPLACE FUNCTION add_man (nickname TEXT, age INTEGER)
RETURNS TABLE
(
man_id BIGINT,
man_nickname TEXT,
man_age INTEGER
)
AS $mytable$
BEGIN
RETURN QUERY
INSERT INTO man_table (man_nickname, man_age) VALUES (nickname, age) RETURNING *;
END
$mytable$ LANGUAGE plpgsql;
Добавим записи в таблицу.
SELECT * FROM add_man ('Oleg', 12);
SELECT * FROM add_man ('George', 18);
SELECT * FROM add_man ('Piter', 7);
SELECT * FROM add_man ('Kate', 21);
Выведем всё содержимое таблицы на экран.
SELECT * FROM man_table ORDER BY man_id ASC;
Создадим собственный тип (тип - запись) для хранения информации об одном человеке.
CREATE TYPE man_zap AS
(
man_id BIGINT,
man_nickname TEXT,
man_age INTEGER
);
Создадим функцию для получения массива людей.
Возраст людей в возвращаемом массиве больше или равен возрасту из параметра функции.
CREATE OR REPLACE FUNCTION get_zap_arr(v INTEGER) RETURNS man_zap ARRAY AS $$
DECLARE x man_zap;
DECLARE arr man_zap ARRAY;
DECLARE number INTEGER;
BEGIN
number = 0;
FOR x IN SELECT * FROM man_table LOOP
IF x.man_age >= v THEN
number = number + 1;
arr[number] = x;
END IF;
END LOOP;
RETURN arr;
END;
$$ LANGUAGE plpgsql;
Протестируем созданную функцию.
SELECT * FROM get_zap_arr(18);
Создадим функцию для конкатенации массива записей в строку.
CREATE OR REPLACE FUNCTION get_concat_string(v INTEGER) RETURNS TEXT AS $$
DECLARE i INTEGER;
DECLARE x man_zap;
DECLARE s TEXT;
DECLARE arr man_zap ARRAY;
BEGIN
arr = get_zap_arr (v);
s = '';
FOR i IN 1..array_length(arr, 1) LOOP
x = arr[i];
s = s || 'Id: ' || x.man_id || ' Age: ' || x.man_age || ' Name: ' || x.man_nickname || ' ';
END LOOP;
RETURN s;
END;
$$ LANGUAGE plpgsql;
Протестируем созданную функцию.
SELECT * FROM get_concat_string(18);
JSON
Напишем функцию, которая преобразует массив в строку в формате JSON
CREATE OR REPLACE FUNCTION get_my_json(v INTEGER) RETURNS TEXT AS $$
DECLARE arr man_zap ARRAY;
DECLARE s TEXT;
BEGIN
s = '[]';
arr = get_zap_arr (v);
IF (array_length(arr, 1) > 0) THEN
s = array_to_json(arr);
END IF;
RETURN s;
END;
$$ LANGUAGE plpgsql;