PostgreSQL
  • Introduction
  • PostgreSQL
    • Введение
    • Установка и базовые операции
    • Запуск команд SQL из файла
    • Агрегатные функции
    • Реляционная алгебра
    • Создание счётчика
    • Изменение структуры таблицы
    • Диапазоны и множества
    • Регулярные выражения
    • Скрипты SQL
    • Группировка
    • Регистры строк
    • Уникальные поля
    • Сортировки и вычисляемые поля
    • Представления
    • Массивы и триггеры
    • Индексы и анализ
    • Текстовый анализ
    • Использование RETURNING
    • Возврат массива записей
    • Внешние ключи
    • Ускорение БД
    • Запросы WITH
    • JSON
Powered by GitBook
On this page
  • Возврат массива записей
  • JSON

Was this helpful?

  1. PostgreSQL

Возврат массива записей

Возврат массива записей

Создадим таблицу для хранения информации о людях.

CREATE TABLE man_table
(
    man_id BIGSERIAL PRIMARY KEY,
    man_nickname TEXT,
    man_age INTEGER
);

Напишем функцию, которая добавляет запись в таблицу и возвращает содержимое добавленной записи.

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;

Протестируем созданную функцию

SELECT * FROM get_my_json(18);
PreviousИспользование RETURNINGNextВнешние ключи

Last updated 5 years ago

Was this helpful?