Иллюстрированный самоучитель по PostgreSQL › PL/pgSQL › Циклы [страница — 263] | Самоучители по программированию
Циклы
Цикл WHILE
Цикл WHILE выполняет блок команд до тех пор, пока заданное условие не станет ложным. При каждой итерации цикла WHILE условие проверяется перед выполнением первой команды блока, и если условие равно TRUE – блок выполняется. Таким образом, если условие никогда не становится равным FALSE, блок выполняется в бесконечном цикле вплоть до принудительного завершения клиентского процесса. Синтаксис цикла WHILE:
[ "метка" ] WHILE условие LOOP команда: […] END LOOP;
В листинге 11.44 циклы WHILE продемонстрированы на примере функции add_two_loop(). Функция увеличивает число на 1 до тех пор, пока не будет достигнуто некоторое пороговое значение. Начальное и конечное значения передаются функции в виде аргументов. Обозначение !=, встречающееся в листинге 11.44, является оператором неравенства. В данном примере условие означает следующее: цикл WHILE продолжает выполняться, пока переменная result не равна переменной highjiumber.
Листинг 11.44. Использование цикла WHILE.
CREATE FUNCTION add_two_loop (integer, integer) RETURNS integer AS ' DECLARE --Объявление псевдонимов для аргументов. low_number ALIAS FOR $1: highjiumber ALIAS FOR $2: --Объявление переменной для хранения результата, result integer = 0: BEGIN --Увеличивать переменную result на 1 до тех пор. --пока она не станет равна high_number. WHILE result!= highjiumber LOOP result: = result + 1: END LOOP: RETURN result; END: ' LANGUAGE 'plpgsql';
Цикл FOR
Возможно, циклы FOR – самая важная разновидность циклов, реализованных в PL/pgSQL. Цикл FOR выполняет программный блок для целых чисел из заданного интервала. У циклов FOR в PL/pgSQL существуют аналоги в других процедурных языках программирования (например, С).
Заголовок цикла FOR начинается с объявления целочисленной переменной, управляющей выполнением цикла.
Затем указывается интервал принимаемых ею значений, а далее следует блок команд. Управляющая переменная уничтожается сразу же после выхода из цикла, причем ее не нужно объявлять в секции объявлений блока. Синтаксис цикла FOR:[ "метке" ] FOR переменная IN [ REVERSE ] выражение!.. выражение? LOOP команда: […] END LOOP:
Цикл FOR выполняет одну итерацию для каждого значения переменной переменная в интервале, границы которого определяются выражениями выражение! и выражекие2 (включительно). В начале цикла переменная инициализируется значением выражения выражение! и увеличивается на 1 после каждой итерации. Если в заголовке цикла присутствует ключевое слово REVERSE, то переменная не увеличивается, а уменьшается.
Примечание
Управляющую переменную цикла не обязательно объявлять вне блока FOR, если вы не собираетесь работать с ней после завершения цикла
PostgreSql postgresql.conf [АйТи бубен]
Файл «postgresql. conf» читается на запуске сервера PostgreSql, либо когда сервер получает сигнал # SIGHUP.
Соединения и аутентификация PostgreSql (Connections and Authentication)
Resource Consumption Resource Consumption(Usage) — за исключением WAL (write ahead log).
shared_buffers = 2GB # ~ 1/8 RAM and for Linux kernel.shmmax=4294967296 (1/4 of RAM) work_mem = 128MB # ~ 1/20 RAM maintenance_work_mem = 1GB # ~ 1/4 RAM effective_cache_size = 4GB # ~ 2/3 RAM max_prepared_transactions = 0 # zero disables the featureУвеличение числа shared_buffers и других параметров памяти потребует изменения настроек разделяемой памяти (Shared memory) вашей операционной системы (Shared Memory and Semaphores). Параметр ядра Linux kernel.shmmax всегда должен быть больше параметра shared_buffers PostgreSQL.
Логирование PostgreSql (Error Reporting and Logging)
logging_collector = on log_directory = 'pg_log' log_filename = 'postgresql-%a. log' log_truncate_on_rotation = on log_rotation_age = 1d log_rotation_size = 0 log_line_prefix = '%t db=%d user=%u ' #log_statement = 'all' log_statement = 'ddl' #log_statement = 'mod'
autovacuum = on log_autovacuum_min_duration = 0 # -1 disables, 0 logs all actions and autovacuum_max_workers = 3 autovacuum_naptime = 10min autovacuum_vacuum_threshold = 1800 autovacuum_analyze_threshold = 900 #autovacuum_vacuum_scale_factor = 0.2 # fraction of table size before vacuum #autovacuum_analyze_scale_factor = 0.1 # fraction of table size before analyze
Как и для всякой программы, работающей с большим объёмом данных, дисковая подсистема является для PostgreSQL определяющей. Поэтому если есть возможность, то лучше вложиться именно в неё. В противоположность дисковой подсистеме процессор нагружается не очень сильно. Поэтому для сервера достаточно, чтобы процессор просто был, хотя лучше чтобы он был не один. К вопросу о дисках можно сказать, что чем их больше — тем лучше.
# echo "kernel.shmmax=2147483648" >> /etc/sysctl.conf # nano postgresql.conf shared_buffers = 1GB checkpoint_segments = 16 effective_cache_size = 512MB work_mem = 8MB maintenance_work_mem = 256MB
Временные интервалы. Хранение и применение в версии PostgreSQL до 9.2 — PostgreSQL Cook Book
При проектировании баз данных довольно часто приходится использовать структуры для хранения интервалов времени. Интервалы бывают с открытыми границами, когда граница интервала не определена, или с закрытой границей, когда граница имеет конкретное значение. Так же границы интервалов могут принадлежать самому интервалу или не принадлежать ему.
В PostgreSQL 9.2 появился новые типы данных — RANGES. В том числе поддерживаются временные интервалы:
- tsrange — интервал времени (дата + время) без временной зоны
- tstzrange — интервал времени (дата + время) с временной зоной
- daterange — интервал времени (только дата без времени)
Эти типы предлагают некоторые возможности из коробки, но не решают архитектурных задач — как хранить интервалы времени, чтобы их было удобно использовать и поддерживать.
Проблема выбора структуры хранения в общем случае не стоит остро. Создаются два поля begin_date и end_date, которые и описывают границы интервала. Разработчики договариваются принадлежат ли границы интервалов самим интервалам, и определяют, как хранить интервалы с открытыми границами.
Вот так можно описать возможные варианты структуры хранения интервалов:
Круглой скобкой обозначается граница интервала, которая не принадлежит самому интервалу, граница с квадратной скобкой принадлежит интервалу (begin_date : end_date) - условие, при котором значение х принадлежит заданному интервалу - begin_date < x < end_date (begin_date : end_date] - услови - begin_date < x <= end_date [begin_date : end_date) - условие - begin_date <= x < end_date [begin_date : end_date] - условие - begin_date <= x <= end_date
Для рассматриваемых интервалов времени проблемы хранения неопределенной границы интервала нет, так как в PostgreSQL есть специальное значение для хранения бесконечного времени — ‘infinity’ (может быть как положительной так и отрицательной ‘-infinity’).
Пример
['2013-01-01' : 'infinity'] - описывает интервал времени, который начинается 1 январа 2013 года и никогда не заканчивается. ['-infinity' : '2013-01-01') - описывает интервал времени, который заканчивается до 1 января 2013 года.
Как же всё-таки хранить интервалы времени в базе данных? Всё зависит от специфики самой базы данных. Если нужно хранить интервалы времени, границами которых являются даты (без времени), то одним из лучших решением будет следующее.
Временные интервалы рекомендуется хранить в структуре [begin_date: end_date) — дата начала интервала принадлежит самому интервалу и сохраняется как есть, дата окончания интервала не принадлежит самому интервалу — получается, что там реально хранится дата следующего дня — end_date + interval ‘1 day’.
Почему бы не хранить дату окончания интервала в естественном виде — [begin_date : end_date]?
Предположим, что есть интервал [‘2012-01-01’ : ‘2012-12-31’] (весь 2012 год). Проблемы с этим интервалом возникнут, когда понадобится проверить вхождение в интервал значения, которое имеет временную часть.
Если дату 5 января, очень легко проверить на вхождение в интервал
'2012-01-01' <= '2012-01-05' <= '2012-12-31'
то дату + время 9 часов утра 31 декабря, которое тоже должно входить в вышеупомянутый диапазон, проверить немного сложнее
'2012-01-01' <= '2012-12-31 09:00:00' <= '2012-12-31' - это условие уже не выполняется
Вполне логичным решением будет округлять проверяемое число до даты — в этом случае условие будет выполняться. Но тогда при выполнении реального запроса к таблице, индексы работать не будут, и работа приложения может сильно замедлиться.
Хранение же интервала в формате [begin_date : end_date) — не обладает выше описанными недостатками и вся его «сложность» заключается в том, чтобы при использовании интервала увеличить границу его окончания на 1 день.
Примечание
Если же в приложении используются только даты без временной части, то любой рассмотренный вариант будет удобным в использовании и высокопроизводительным.
PostgreSQL рекурсивный запрос
Рассмотрим создание рекурсивного запроса на Postgresql .
Рекурсивный запрос необходим, для вывода данных на основе предыдущих строк в выборке. Реализуется он с помощью оператора WITH.
Общая схема рекурсивного запроса:
WITH RECURSIVE t AS (
нерекурсивная часть (1)
UNION ALL
рекурсивная часть (2)
)
SELECT * FROM t; (3)
Чтобы не мучать Вас теорией, перейдем сразу к практике. С помощью рекурсивного запроса, можно вывести сумму чисел от 1 до 10.
Также с помощью, рекурсивного запроса можно решать, более сложные математические задачи. Например выведем числа Фибоначчи.
Таким образом, рекурсивный запрос, может помочь в решении, самых разнообразных задач. Осталось только, научиться их писать…
Самое сложное, это выделить нерекурсивную часть. В демо-примерах достаточно просто, начинаются итерации с простых чисел. В коммерческих проектах, все намного сложнее. После того, как выделили нерекурсивную часть, нужно подумать, об алгоритме расчета последующих строк, и когда данный расчет должен закончится.
Приведу пример из моей практики: «Расчет сальдовки с помощью postgresql».
Работал я еще тогда мидл-разработчиком, в достаточно известной фирме ООО «Эттон» в городе Казани. Занималась данная компания автоматизацией ЖКХ. Наша команда разрабатывала продукт «Регион», для ведения капитального ремонта. Я в частности отвечал, за модуль «Биллинг».
Модуль «Биллинг» обрабатывал данные по собственникам в БД под управлением PostgreSQL. Обработка данных происходила на стороне сервера, с помощью микросервисов. И чтобы получить данные по входящему и исходящему сальдо, для отчетов. Нам разработчикам, приходилось писать запрос, обрабатывать данные на сервере, и добавлять уже обработанные данные по расчитанной сальдовке.
Все это приводило к тому, что тратили лишнее время на разработку функционала и производительность данных скриптов была крайне низкой.
Чтобы было, более понятно, приведу таблицу, как должен вестись расчет:
Период | Входящее сальдо | Начислено | Оплачено | Пени | Исходящее сальдо |
февраль 2017 | 0.00 | 100.00 | 60.00 | 0.00 | 40.00 |
март 2017 | 40.00 | 100.00 | 0.00 | 0.00 | 140.00 |
апрель 2017 | 140.00 | 100.00 | 0.00 | 3.00 | 243.00 |
Первым решением, было хранить уже посчитанные данные, в аггрегирующей таблице.
Добавили триггеры, чтобы пересчитывать данные. Данные пересчитывались, опять же средствами микросервисов. Но при большом количестве изменении данных, сервера не выдерживали нагрузки. Расчет происходил медленно. Напомню, на самом загруженном регионе, у нас ежедневно добавлялось около 500 тысяч записей.
В качестве эксперимента, попробовал сделать расчет с помощью рекурсивного запроса. Но расчет происходил еще медленнее. Но после того как оптимизировал запрос, добавил ряд индексов и изменил настройки postgresql. Все заработало. Радости не было предела, с помощью данного метода избавились, от множества проблем. Это была любовь по расчету =)
Ниже приведу, с какими проблемами я столкнулся при написании запроса, и как их решил:
Приведу упрощенную схему структуры таблицы «billing_bill_account_operation», где хранятся данные по начислениям собствеников.
Для облегчения понимания, как писать запрос, разделим его на несколько этапов.
Первый этап состоит, из написания нерекурсивной части. Так как, нам необходимо расчитать сальдовку, по всем лицевым счетам по месяцам, напишем запрос который расчитывает начальный период по каждому лицевому счету.
Получим следующие данные:
account_id | period | in_saldo | credited | paid | peni | out_saldo |
1 | 2017-01-01 | 0 | 300.00 | 150.00 | 0.00 | 450.00 |
2 | 2017-01-01 | 0 | 240.00 | 0.00 | 0.00 | 240.00 |
3 | 2017-01-01 | 0 | 180.00 | 0.00 | 0.00 | 180. 00 |
Вторым этапом, создадим запрос, для рекурсивной части, с одной итерацией.
Данный запрос вернет данные за следующий месяц, то есть за февраль 2017 года.
account_id | period | credited | paid | peni |
1 | 2017-02-01 | 0.00 | 50.00 | 0.00 |
2 | 2017-02-01 | 80.00 | 0.00 | 0.00 |
3 | 2017-02-01 | 60.00 | 0.00 | 0.00 |
А теперь, третьим этапом, попробуем совершить «магию», соединить нерекурсивную часть, с рекурсивной частью.
Для этого воспользуемся конструкцией WITH RECURSIVE. Итоговый запрос, будет выглядеть следующим образом.
Здесь, самое сложное было, определить, как переходить на следующую запись. Решили данный вопрос переходом на строчку со следующим месяцем. А заканчивается итерация после того, как заканчиваются записи сгрупированные по месяцам. Еще нужно иметь ввиду, если в нерекурсивной части запрос вернул например 3 записи, значит будет 3 отдельных итерации.
В итоге, получим следующие данные:
account_id | period | in_saldo | credited | paid | peni | out_saldo |
1 | 2017-01-01 | 0 | 300.00 | 150.00 | 0.00 | 450.00 |
1 | 2017-02-01 | 450.00 | 0. 00 | 50.00 | 0.00 | 500.00 |
2 | 2017-01-01 | 0 | 240.00 | 0.00 | 0.00 | 240.00 |
2 | 2017-02-01 | 240.00 | 80.00 | 0.00 | 0.00 | 320.00 |
2 | 2017-03-01 | 320.00 | 80.00 | 0.00 | 2.00 | 402.00 |
3 | 2017-01-01 | 0 | 180.00 | 0.00 | 0.00 | 180.00 |
3 | 2017-02-01 | 180.00 | 60.00 | 0.00 | 0.00 | 240.00 |
При написании статьи, были использованы следующие ресурсы:
https://postgrespro.ru/docs/postgrespro/9.6/queries-with
https://habrahabr. ru/company/postgrespro/blog/318398/
Если вам помогла статья, пожалуйста перейдите по одному из рекламных блоков, расположенных на сайте. Таким образом вы поддержите проект. Спасибо
Тюнинг PostgreSQL 9.4.2-1.1C для 1С:Предприятия 8.3: рельаный опыт настройки
28 сентября 2016 ВК Tw Fb
Как только размер файловой базы данных 1С:Предприятие одного из наших клиентов достиг размера в 32Гб (да, 32Гб), в следствии чего всё постепенно начало тормозить, а потом и встало намертво, наши клиенты попросили нас решить эту проблемы. SSD Enterprise класса ненадолго подсластил пилюлю, но через некоторое время всё вернулось в исходную точку. Ну что ж, тут и к бабке не ходи – переходим на SQL версию БД.
Поскольку мы ярые пользователи Windows, доступно нам только два варианта СУБД – это MSSql и PostgreSQL. Первый хорош до безумия, но стоимость не порадовала. А ещё больше не порадовала новость о дополнительных лицензиях 1С для работы с MSSQL. Поэтому PostgreSQL.
Подробная инструкция с видео доступна здесь. В этой статье мы пройдёмся по ключевым моментам.
Не забываем про резервное копирование баз данных 1С!
Исходные данные:
- ОС Windows Server 2008R2,
- Intel Core i7-2600K 3.40GHz,
- 32Gb RAM,
- Intel SSD DC3700 100Gb (только под БД, ОС на отдельном SSD),
- от 10 до 20 пользователей в БД ежедневно,
- обмен с 5 узлами распределённой БД в фоне.
Зловеще, не правда ли? Приступим.
1. Установка PostgreSQL и pgAdmin.
Никаких откровений по поводу того, откуда качать PostgreSQL не будет — это наш любимый сайт https://releases.1c.ru, раздел «Технологические дистрибутивы». Скачиваем, ставим. Не забываем установить MICROSOFT VISUAL C++ 2010 RUNTIME LIBRARIES WITH SERVICE PACK 1, который идёт в архиве с дистрибутивом. Сами попались на это: не установили, испытали много боли.
Ставим всё на далее, далее, кроме следующих моментов. Устанавливаем, как сервис (галочка) и задаём параметры учётной записи Windows, не PostgreSQL.
Инициализируем кластер базы данных (галочка). А вот здесь задаём параметры учётной записи для PostgreSQL! Важно: у Вас должна быть запущена служба «Secondary Logon» (или на локализированных ОС: «Вторичный вход в систему»). Кодировка UTF8 — это тоже важно!
Дальше ничего интересного. Далее…
pgAdmin в этой сборке староват. Идём на https://www.postgresql.org/ftp/pgadmin3/release/. На момент написания статьи самая свежая версия 1.22.1. Качаем её, ставим. Заходим.
На процессе установки оснастки «Администрирование серверов 1С Предприятия» не будем останавливаться. Это совсем другая тема. Да и сложного там ничего нет.
Создаём SQL БД в этой оснастке, проверяем в pgAdmin — БД там появиться, если всё указано верно.
2. Тюнинг PostgreSQL 9.4.2.
Дальше вбиваем себе в голову следующее: перед любым сохранением новых настроек, делайте резервные копии файлов:
- pg_hba.conf
- postgresql.conf
- pgpass.conf
которые лежат здесь:
C:\Program Files\PostgreSQL\9.4.2-1.1C\data
Если Вы ошибётесь хоть в одной букве, после обновления конфигурации PostgreSQL не запуститься. Выяснить что же стало причиной будет сложно, даже смотря в журналы Windows. Поэтому не меняйте много параметров сразу и делайте резервные копии.
Для правки конфига есть удобный инструмент, доступный прямо из главного окна pgAdmin. Вот он:
Что мы здесь меняем:
- shared_buffers — Количество памяти, выделенной PgSQL для совместного кеша страниц. Эта память разделяется между всеми процессами PgSQL. Делим доступную ОЗУ на 4. В нашем случае это 8Gb.
- effective_cache_size — Оценка размера кэша файловой системы. Считается так: ОЗУ — shared_buffers. В нашем случае это 32Gb — 8Gb = 24Gb. Но лично я оставляю этот параметр ещё ниже, где-то 20Gb — всё-таки ОЗУ нужна не только для PostgreSQL.
- random_page_cost = 1.5 — 2.0 для RAID, 1.1 — 1.3 для SSD. Стоимость чтения рандомной страницы (по-умолчанию 4). Чем меньше seek time дисковой системы тем меньше (но > 1.0) должен быть этот параметр. Излишне большое значение параметра увеличивает склонность PgSQL к выбору планов с сканированием всей таблицы (PgSQL считает, что дешевле последовательно читать всю таблицу, чем рандомно индекс). И это плохо.
- temp_buffers = 256Mb. Максимальное количество страниц для временных таблиц. То есть это верхний лимит размера временных таблиц в каждой сессии.
- work_mem — Считается так: ОЗУ / 32. .64 — в нашем случае получается 1Gb. Лимит памяти для обработки одного запроса. Эта память индивидуальна для каждой сессии. Теоретически, максимально потребная память равна max_connections * work_mem, на практике такого не встречается потому что большая часть сессий почти всегда висит в ожидании.
- bgwrite_delay — 20ms. Время сна между циклами записи на диск фонового процесса записи. Данный процесс ответственен за синхронизацию страниц, расположенных в shared_buffers с диском. Слишком большое значение этого параметра приведет к возрастанию нагрузки на checkpoint процесс и процессы, обслуживающие сессии (backend). Малое значение приведет к полной загрузке одного из ядер.
- synchronous_commit — off. ОПАСНО! Выключение синхронизации с диском в момент коммита. Создает риск потери последних нескольких транзакций (в течении 0.5-1 секунды), но гарантирует целостность базы данных, в цепочке коммитов гарантированно отсутствуют пропуски. Но значительно увеличивает производительность.
Это далеко не всё, что удалось узнать из Интернета и статей на https://its.1c.ru. НО! Даже этих настроек хватит, чтобы видимо ускорить работу 1С:Предприятие на PostgreSQL.
В этом конкретном случае после перехода на PostgreSQL пользователи стали жаловаться, что 1С начала тормозить ещё сильнее, чем в файловом варианте. Но после этого тюнинга база «полетела». Теперь все наслаждаются быстрой работой. Однако есть и свои минусы в виде блокировок. Останавливаться на это мы не планируем, будем копать дальше и выкладывать полезные изменения конфигурации PostgreSQL сюда.
Если с базой данных возникли какие-то проблемы, возможно, Вам поможет внутреннее или внешнее тестирование.
Базы данных 1С можно публиковать на веб-серверах!
PostgreSQL PL / pgSQL, объяснение цикла пока на примерах
Резюме : в этом руководстве вы узнаете об операторе цикла PL / pgSQL while
.
Введение в PL / pgSQL цикл while
Оператор цикла while
выполняет блок кода до тех пор, пока условие не оценивается как false
.
Язык кода: диалект PostgreSQL SQL и PL / pgSQL (pgsql)
[<метка>] цикл условий while заявления; конец петли;
В этом синтаксисе PostgreSQL оценивает условие
перед выполнением операторов
.
Если условие истинно, выполняется инструкция
. После каждой итерации цикл while
снова оценивает кодирование
.
Внутри тела цикла while
вам необходимо изменить значения некоторых переменных, чтобы в некоторых точках условие
было ложным
или null
. В противном случае у вас будет неопределенный цикл.
Поскольку цикл while
проверяет условие
перед выполнением операторов
, цикл while
иногда называют циклом предварительного тестирования.
Следующая блок-схема иллюстрирует оператор цикла while
.
PL / pgSQL, пример цикла while
В следующем примере для отображения значения счетчика используется оператор цикла while
:
Язык кода: диалект PostgreSQL SQL и PL / pgSQL (pgsql)
do $$ объявить счетчик целое: = 0; начать пока счетчик <5 цикл поднять уведомление «Счетчик%», счетчик; счетчик: = счетчик + 1; конец петли; конец $$;
Вывод:
Язык кода: Shell Session (shell)
ПРИМЕЧАНИЕ: Счетчик 0 ВНИМАНИЕ: счетчик 1 ВНИМАНИЕ: счетчик 2 ВНИМАНИЕ: счетчик 3 ВНИМАНИЕ: счетчик 4
Как это работает.
- Сначала объявите переменную counter и инициализируйте ее значение до 0.
- Во-вторых, используйте оператор цикла
while
, чтобы показать текущее значение счетчикаи
завершается.
В этом руководстве вы узнали, как использовать оператор цикла while в PL / pgSQL для выполнения блока кода, пока выполняется условие.
- Было ли это руководство полезным?
- Да Нет
Типы циклов Postgres | ObjectRocket
Введение
Этот урок представляет собой изучение различных типов циклов Postgres, доступных для использования при программировании баз данных. Типы циклов, о которых мы здесь узнаем, включают Loop , For Loop и While Loop . Мы также включим несколько примеров циклов SQL, в которых мы используем массив PostgreSQL как часть запросов.
Предварительные требования
- Понимание того, что означает «цикл»: повторение некоторого кода определенное количество раз и / или до тех пор, пока не будут выполнены некоторые требования.Этот процесс цикла часто включает увеличение переменной для отслеживания числа или иного ограничения количества итераций в цикле.
- Опыт работы с базовыми операторами SQL Postgres, такими как SELECT, FROM, UPDATE и INSERT.
- Базовое понимание массивов. Без проблем! Мы начнем урок с базовой инструкции по массивам в PostgreSQL.
Массив Postgres
Массив - это группа или список элементов. Массивы могут повысить эффективность и сэкономить работу и время.«1, 9, 3, 4, 5, 2» - это массив целых чисел. «Тим, Джед, Сал, Терри, Джеймс» - это массив текстовых элементов. Мы используем «элементы» для описания каждого человека в массиве.
Postgres имеет тип данных «Массив». Внутри «ячейки» - сечения между строкой и столбцом базы данных - вы можете иметь типы данных массива, в отличие от текстовых или целочисленных типов данных.
Пример массива Postgres
1 | СОЗДАТЬ ТАБЛИЦУ tbl_products ( |
Анализ
В приведенном выше SQL тип текстовых данных, используемый для «t_name_product», может быть вам знаком.Столбец, который мы назвали «arr_i_security_level», может быть для вас новым, так как это тип данных Array. Скобки («[]») указывают на то, как мы указываем PostgreSQL «установить этот столбец как тип массива».
Чтобы начать наш урок о типах циклов PostgreSQL, мы сначала рассмотрим самые простые типы циклов, доступные в Postgres, которые не требуют условий.
Цикл PostgreSQL
Цикл Postgres без условий полагается на EXIT WHEN для выхода из цикла. Вот как это выглядит:
Синтаксис Postgres LOOP
1 | LOOP |
Анализ
Имейте в виду, что вышеупомянутый цикл Postgres будет выполняться вечно, если условие [условия выполнены] не дает положительного результата. Здесь пригодится предложение EXIT WHEN. См. Пример цикла PostgreSQL ниже.
Пример Postgres LOOP
1 | i_counter: = 0 |
Цикл For PostgreSQL
Циклы For можно использовать для циклического перебора диапазона целых чисел или объектов.Мы покажем примеры того, как перебирать числа и другие типы. Postgres For Loop может иметь наибольшее количество вариаций во всех типах циклов в PostgreSQL.
Синтаксис цикла FOR Postgres
1 | FOR [имя счетчика] IN [REVERSE] [START VALUE] .. [END VALUE] [BY step] |
Пример цикла FOR в Postgres
1 | НАЧАТЬ |
1 | УВЕДОМЛЕНИЕ: Количество номеров: 100 |
Анализ
- i_num_count : переменная, используемая для отслеживания и сохранения текущей позиции, в которой мы находимся в цикле for.
- 100 .. 400 : диапазон (начальное и конечное значение) нашего цикла.
- BY 100 - «степпинг»; сколько значений пропускать на каждой итерации цикла.
- LOOP : Начало нашего цикла For.
- END LOOP : Конец цикла For.
Еще один эффективный способ использования цикла For в Postgres - это итерация по массиву объектов, при этом вам не нужно знать, сколько объектов находится в этом массиве.
For Пример массива сквозных циклов
1 | BEGIN |
1 | УВЕДОМЛЕНИЕ: Имя: Салли |
Для результатов запроса цикла
Наконец, мы можем использовать цикл For для перебора результатов запроса!
1 | BEGIN |
1 | УВЕДОМЛЕНИЕ: Имя: Фред |
Цикл while PostgreSQL
В Postgres цикл WHILE похож на цикл For, который мы обсуждали выше. Он требует, чтобы условие и операторы выполнялись на каждой итерации цикла While.
Синтаксис цикла while в Postgres
1 | WHILE [условия] |
Использование цикла WHILE в SQL
Важно учитывать, что при написании SQL предложения HAVING или WHERE обычно достаточно для ограничения извлекаемых строк.Иногда WHILE LOOP более эффективен, а в других ситуациях он усложняет ваш SQL. Поэтому спросите себя: «Могу ли я сделать это с помощью оператора WHERE или HAVING?» В ситуациях, когда предложения HAVING или WHERE не дают желаемых результатов, WHILE может оказаться тем, что вам нужно. Давайте посмотрим на некоторые варианты использования.
Подсчет чисел с помощью цикла WHILE
1 - | ) 1 Объявление vars. DECLARE i_increment INT: = 1; i_num_current INT: = 1; i_finish INT: = 5; - (2) Сообщает Postgres область применения приложения в гнезде от BEGIN до END. BEGIN - (3) Определите наши итерации в гнезде LOOP to END LOOP. WHILE i_num_current <= i_finish LOOP - (4) Используемый код. Здесь мы делаем две вещи: - (a) Увеличиваем i_num_current var. i_num_current: = i_num_current + i_increment; - (b) Вывести значение i_num_current. УВЕДОМЛЕНИЕ О ПОВЫШЕНИИ i_num_current; - К сведению: в большинстве других форм TSQL мы используем «Печать» вместо «Поднять уведомление». КОНЕЧНАЯ ПЕТЛЯ; КОНЕЦ; |
Анализ
- ОБЪЯВЛЯЕМ переменные, которые мы будем использовать в цикле Postgres WHILE.
- BEGIN определяет начало нашего приложения.
- Установите тип цикла PostgreSQL как WHILE вместе с условием, при котором i_num_curren должно оставаться меньше или равным i_finish.
Выполнение вышеуказанного кода даст следующие результаты:
Теперь, когда вы понимаете основы использования цикла WHILE в Postgres, давайте изменим базу данных!
Заполнить таблицу порядковыми номерами
Теперь применим наше новое понимание цикла Postgres WHILE к таблице базы данных. Начнем с простого случая заполнения столбца целыми числами.
Для начала давайте создадим простую тестовую таблицу с помощью команды SQL CREATE TABLE:
1 | СОЗДАТЬ ТАБЛИЦУ public.тест ( |
Когда мы выполняем приведенный выше код в PostgreSQL, мы получаем новую пустую таблицу с одним столбцом. Это все, что нам нужно для этого примера. Теперь, чтобы написать сценарий запроса Postgres для заполнения 300 строк целым числом, мы увеличим его, используя WHILE LOOP из PostgreSQL.
1 | DECLARE |
В приведенном выше SQL основное изменение, которое мы сделали, было изменение «i_finish» на 300, замена «RAISE NOTICE i_num_current» на «INSERT INTO test (i_numberoo) SELECT i_num_current». Это добавляет записи в таблицу «tbl_number_test». Другими словами, мы заполнили поле «i_numberoo» числами от 1 до 300, по одному в каждой строке.
Результаты запроса цикла
Чтобы убедиться, что мы получаем то, что хотим, после выполнения этого запроса мы можем проверить, сколько записей было создано:
1 | ВЫБРАТЬ СЧЕТ (*) ИЗ tbl_number_test; |
Когда мы выполняем указанную выше команду SELECT, PostgreSQL возвращает счетчик 300, потому что мы вставили 300 строк в таблицу «tbl_number_test».
Заключение
В этом уроке мы исследовали использование различных типов циклов Postgres, доступных через команды SQL. Мы начали с самого простого, LOOP, который не имеет условий и поэтому требует EXIT. Мы перешли к циклу FOR и, наконец, наиболее подробно рассмотрели цикл WHILE PostgreSQL. Для каждого из них мы рассмотрели синтаксис цикла и хотя бы один пример цикла.
Использование Postgres While Loop в SQL
Введение
В этом руководстве мы научимся запрашивать Postgres с помощью цикла While.Включим:
- Что? Что на самом деле «WHILE» делает и каков синтаксис?
- Почему и как? Почему и как мы используем цикл «WHILE» и где / когда мы можем использовать его в SQL, который мы пишем?
Предварительные требования
- Знание того, как выполнять операторы SQL только с PostgreSQL (или Oracle, MS SQL Server, MySQL и т. Д.), Используя PG Admin или какой-либо другой инструмент администрирования баз данных, или даже используя язык программирования (например, Python, Node , PHP, Java и др.), который обеспечивает соединение с вашей базой данных, а также метод отправки ей команд SQL (или T-SQL) для внесения изменений в базу данных.
- Начальный уровень знаний основных команд SQL, включая
SELECT
,FROM
иINSERT
.
Что такое «ПОКА»? Как это работает?
В PostgreSQL структура WHILE
определяет условие и цикл. Синтаксис следующий:
1 | WHILE [состояние] |
Информационный лакомый кусочек: в некоторых других формах реляционных баз данных SQL, включая Microsoft MS SQL Server, структура цикла
WHILE BEGIN END
выглядит следующим образом:
1 | WHILE [условие] |
Информационный лакомый кусочек: в MySQL синтаксис
WHILE LOOP
:
1 | WHILE [условие] |
Вот блок-схема, которая дает вам визуальное представление о выполнении программы цикла WHILE:
Почему и как мы используем «WHILE» в нашем SQL?
Важно учитывать, что при написании SQL предложения HAVING
или WHERE
обычно достаточно для ограничения того, какие строки будут возвращены или по которым будут выполняться действия. Имейте это в виду! Зачастую WHILE LOOP
добавляет ненужную сложность вашему запросу или коду. Поэтому мы советуем вам выработать привычку спрашивать себя: «Могу ли я сделать это с помощью оператора HAVING
или WHERE
вместо использования структуры WHILE LOOP END LOOP
?» В довольно редких ситуациях, когда предложение HAVING
или WHERE
не поможет, WHILE
может быть именно тем, что вам нужно. Давайте посмотрим на некоторые варианты использования.
Пример использования 1. Простой подсчет чисел
1 | 1) Объявите свои переменные DECLARE i_start INT: = 0; i_increment INT: = 1; i_current INT: = 1; i_end INT: = 6; - (2) Сообщите Postgres объем нашей программы, вложенной в контейнер BEGIN. .END. BEGIN - (3) Определите наш цикл в контейнере LOOP..END LOOP. WHILE i_current <= i_end LOOP - (4) Код для выполнения. В этом случае мы делаем две вещи: - (a) Увеличиваем нашу переменную i_current. i_current: = i_current + i_increment; - (b) Печать значения i_current. УВЕДОМЛЕНИЕ О ПОВЫШЕНИИ i_current; - информационный лакомый кусочек: в большинстве других форм TSQL мы используем «Print» вместо «Raise Notice». КОНЕЧНАЯ ПЕТЛЯ; КОНЕЦ; |
Анализ кода выше:
- Сначала мы
ОБЪЯВЛЯЕМ
переменных, которые будем использовать в нашем цикле WHILE. - Затем следует оператор
BEGIN
, чтобы обозначить начало нашей «программы». - Затем мы определяем наш тип цикла как
WHILE
вместе с его условием. Пока это условие оценивается как истинно , будут выполняться команды междуLOOP
иEND LOOP
.
Выполнение вышеуказанного кода даст следующие результаты:
Теперь, когда вы познакомились с базовым примером, давайте фактически изменим базу данных!
Вариант использования 2: заполнить таблицу 350 последовательными числами
Теперь мы применим наши новые знания о цикле WHILE к таблице базы данных. Мы начнем с рассмотрения простого случая, когда мы хотим заполнить столбец последовательными числами.
Во-первых, давайте создадим простую тестовую таблицу с помощью команды SQL CREATE TABLE
:
1 | - CREATE TABLE создает новую пустую таблицу. |
Информационный лакомый кусочек: обратите внимание: если у вас не включена автоматическая фиксация, вам может потребоваться выполнить команду
COMMIT
. Если вы не использовалиCOMMIT
сROLLBACK
, мы настоятельно рекомендуем изучить и изучить эти команды!
Когда мы выполняем приведенный выше код в PostgreSQL, мы получаем новую пустую таблицу с одним полем (столбцом).Теперь мы быстро заполним первые 350 строк столбца id_new_num числом, которое мы будем увеличивать с помощью WHILE LOOP.
1 | DECLARE |
Обратите внимание: еще раз: если у вас не включена автоматическая фиксация, вам может потребоваться выполнить команду COMMIT
для изменения базы данных.
В приведенном выше модифицированном новом коде единственное изменение, которое мы внесли, - это изменить «i_end» с 5 на 350 и удалить RAISE NOTICE i_current;
и замените его на INSERT INTO test (id_new_num) SELECT i_current;
, чтобы добавить записи в таблицу.В частности, мы заполнили пять строк поля «id_new_num» числами от 1 до 350.
Посмотрим на результаты запроса!
Чтобы убедиться, что мы получаем то, что хотим, после выполнения этого запроса мы можем проверить, сколько записей было создано:
1 | ВЫБРАТЬ СЧЕТЧИК (*) ИЗ public.test; |
Когда мы выполняем указанную выше команду SELECT
, PostgreSQL вернет счетчик 350, потому что мы добавили 350 строк в нашу пустую таблицу.
Заключение
В этой статье мы узнали о некоторых основных способах использования оператора цикла WHILE
в SQL-запросах Postgres. Мы также рассмотрели несколько примеров, в которых может потребоваться использование этого оператора. Учитывая сложность и широту возможностей с циклами WHILE
и циклами в целом, мы сделали это руководство как можно более простым, но в то же время добавили некоторые «лакомые кусочки информации», которые мы рекомендуем вам изучить. Хотя это руководство было написано специально для пользователей PostgreSQL, а не для конкретного языка программирования, мы увидели важность того, чтобы прояснить, что структура WHILE LOOP
немного меняется между различными популярными системами реляционных баз данных.
Краткое руководство по написанию функций PLPGSQL: Часть 2
В первой части «Руководства по написанию функций PLPGSQL» мы рассмотрели анатомию функции plpgsql и основные циклы IF и FOR. Во второй части нашей серии кратких руководств по PLPGSQL мы более подробно рассмотрим поток управления. Как мы упоминали в предыдущей части, для PLPGSQL существуют следующие конструкции потока управления.
- ДЛЯ somevariable IN (1 ... someendnumber) LOOP .. END LOOP;
- ДЛЯ somevariable IN REVERSE someendnumber.. 1 BY somestep ПЕТЛЯ .. КОНЕЦ ПЕТЛИ;
- ДЛЯ somevariable IN EXECUTE ( somesqlquery ) LOOP ..RETURN NEXT; .. КОНЕЦ ПЕТЛИ;
- LOOP ..логические операторы EXIT .. EXIT WHEN .. CONTINUE WHEN .. END LOOP;
- WHILE ... LOOP ... END LOOP;
- ИСКЛЮЧЕНИЕ КОГДА .... КОГДА ..
- Представлен в версии 8.3 RETURN QUERY, который может быть в любой структуре типа LOOP или автономным. Это описано в Новые возможности функций PostgreSQL
В этом разделе мы продемонстрируем цикл через наборы записей и напишем функцию возврата набора.В следующем разделе после мы немного углубимся в рекурсивные функции, обновление таблиц и создание уведомлений.
FOR somevariable IN somesqlquery
Это в до-8.3 была наиболее распространенной конструкцией для циклического перебора записей. Это по-прежнему единственный способ вернуть набор записей, в которых оператор запроса динамически изменяется внутри процедуры. Ниже приведен пример такой вещи.
- Просто возвращаю строку СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ФУНКЦИЮ somefuntext (param_numcount integer) ВОЗВРАЩАЕТ текст КАК $$ ЗАЯВИТЬ текст результата: = ''; searchsql text: = ''; var_match text: = ''; НАЧАТЬ searchsql: = 'ВЫБРАТЬ n || 'вниз' Как обратный отсчет FROM generate_series ('|| CAST (param_numcount As text) ||', 1, -1) As n '; FOR var_match IN EXECUTE (searchsql) LOOP ЕСЛИ результат> '' ТО результат: = результат || ';' || var_match; ELSE результат: = var_match; КОНЕЦ ЕСЛИ; КОНЕЦ ПЕТЛИ; ВОЗВРАТ результат; КОНЕЦ; $$ ЯЗЫК 'plpgsql' НЕЗАМЕНИМЫЙ; - Чтобы использовать, сделайте это - ВЫБЕРИТЕ somefuntext (10); --- РЕЗУЛЬТАТ --- 10 вниз; 9 вниз; 8 вниз; 7 вниз; 6 вниз; 5 вниз; 4 вниз; 3 вниз; 2 вниз; 1 вниз
- Возврат набора струн СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ФУНКЦИЮ somefun_settext (целое число param_numcount) ВОЗВРАЩАЕТ текст SETOF КАК $$ ЗАЯВИТЬ текст результата: = ''; searchsql text: = ''; var_match text: = ''; НАЧАТЬ searchsql: = 'ВЫБРАТЬ n || 'вниз' Как обратный отсчет FROM generate_series ('|| CAST (param_numcount As text) ||', 1, -1) As n '; FOR var_match IN EXECUTE (searchsql) LOOP ВОЗВРАТ ДАЛЕЕ var_match; КОНЕЦ ПЕТЛИ; КОНЕЦ; $$ ЯЗЫК 'plpgsql' НЕИЗМЕННЫЙ; - Чтобы использовать, сделайте это ВЫБЕРИТЕ n FROM somefuntext (10) Как n;
--- РЕЗУЛЬТАТ --- п --------- 10 вниз 9 вниз 8 вниз 7 вниз 6 вниз 5 вниз 4 вниз 3 вниз 2 вниз 1 вниз (10 рядов)
- Возврат набора анонимных записей
СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ФУНКЦИЮ somefun_recordset (целое число param_numcount)
ВОЗВРАЩАЕТ запись SETOF КАК
$$
ЗАЯВИТЬ
текст результата: = '';
searchsql text: = '';
var_match record;
НАЧАТЬ
searchsql: = 'ВЫБРАТЬ n || '' вниз '' Как обратный отсчет, n как целое число
FROM generate_series ('|| CAST (param_numcount As text) ||', 1, -1) As n ';
FOR var_match IN EXECUTE (searchsql) LOOP
ВОЗВРАТ ДАЛЕЕ var_match;
КОНЕЦ ПЕТЛИ;
КОНЕЦ;
$$
ЯЗЫК 'plpgsql' НЕЗАМЕНИМЫЙ;
Чтобы вызвать вышеупомянутое, вы должны сделать что-то вроде ниже.Обратите внимание, что при вызове набора записей псевдонимов нам нужно для определения структуры вывода. Преимущество набора записей псевдонима заключается в том, что вы можете иметь все виды запросов используют одну и ту же функцию, если вашему вызывающему запросу известна ожидаемая структура. Обратной стороной является что вы должны отметить ожидаемую структуру, которая быстро становится раздражающей, если она всегда одна и та же.
ВЫБЕРИТЕ r.n, r.countdown
ИЗ somefun_recordset (10)
Как r (текст обратного отсчета, n целое)
ЗАКАЗАТЬ ПО r.n;
--- РЕЗУЛЬТАТ -
п | обратный отсчет
---- + -----------
1 | 1 вниз
2 | 2 вниз
3 | 3 вниз
4 | 4 вниз
5 | 5 вниз
6 | 6 вниз
7 | 7 вниз
8 | 8 вниз
9 | 9 вниз
10 | 10 вниз
Чтобы не указывать структуру вывода вашего запроса, вам необходимо либо использовать именованный тип, либо использовать таблицу в качестве типа. ПРИМЕЧАНИЕ. Все таблицы и представления в PostgreSQL имеют соответствующий тип строки, который автоматически создается для них, поэтому, если результаты вашего вывода соответствует типу таблицы, вы можете использовать этот тип записи таблицы в качестве вывода.Ниже мы демонстрируем создание типа для хранения каждой строки и его использование.
СОЗДАТЬ ТИП somefun_type As (текст обратного отсчета, n целое, somethingrandom числовое);
СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ФУНКЦИЮ somefun_setoftype (целое число param_numcount)
ВОЗВРАЩЕНИЕ SETOF somefun_type AS
$$
ЗАЯВИТЬ
текст результата: = '';
searchsql text: = '';
var_match somefun_type;
НАЧАТЬ
searchsql: = 'ВЫБРАТЬ n || '' вниз '' В качестве обратного отсчета, n как целое, random () как числовое
FROM generate_series ('|| CAST (param_numcount As text) ||', 1, -1) As n ';
FOR var_match IN EXECUTE (searchsql) LOOP
ВОЗВРАТ ДАЛЕЕ var_match;
КОНЕЦ ПЕТЛИ;
КОНЕЦ;
$$
LANGUAGE 'plpgsql' VOLATILE;
--Пример прогона -
ВЫБЕРИТЕ myfun.n, myfun.somethingrandom
ОТ somefun_setoftype (10) Как myfun
ГДЕ myfun.n IN (2,3);
п | что-то случайное
--- + -------------------
3 | 0,78656436316669
2 | 0,818326753564179
PostgreSQL - Wikipedia, свободная энциклопедия
PostgreSQL , también llamado Postgres , это система управления базами реляционных данных, ориентированная на объекты и исходный код SQL, общедоступная версия PostgreSQL, общедоступная PostgreSQL аналогично BSD или MIT.
Como muchos otros proyectos de código abierto, el desarrollo de PostgreSQL no es manejado por una empresa o persona, sino que es dirigido por una comunidad de desarrolladores que trabajan de forma desinteresada, altruista, libre or apoy. Общее название PGDG ( PostgreSQL Global Development Group ).
PostgreSQL не имеет дефектов, но требует различного решения. [2]
Nombre del producto [редактор]
Использование персонажей в поисковой системе PostgreSQL, созданной для создания пользовательских интерфейсов с первого взгляда.Las distintas pronunciaciones de "SQL" pueden llevar a confusión. Los desarrolladores de PostgreSQL lo pronuncian / poːst ɡɹɛs kjuː ɛl / ;. Es también común oír abreviadamente como simplemente "Postgres", el que fue su nombre original. Обсуждение вопроса об установлении SQL-запроса на сервер, относящемся к базам данных, которые рассматриваются в сообществе, прежде всего, в Postgres. В связи с эмбарго, команда PostgreSQL Core появилась в 2007 году, когда продукт был отключен от PostgreSQL. Номер имеет ссылку на исходный проект, связанный с базой данных "пост-Энгр", и с оригинальными авторесурсами для базы данных Энгр.
PostgreSQL имеет большое развитие, созданное в 1982 году в рамках проекта Ingres en la Universidad de Berkeley. Этот проект, лидер Майкла Стоунбрейкера, является одним из основных намерений по реализации двигателя базы реляционных данных. Después de haber trabajado un largo tiempo en Ingres y de haber tenido una experiencecia comercial con el mismo, Michael decidió volver a la Universidad en 1985 para trabajar en un nuevo proyecto sobre la experience de Ingres, dicho proyecto ingres llamado post-llamado simplemente ПОСТГРЭС.
El proyecto post-ingres pretendía resolver los issuesas con el modelo de base de datos relacional que habían sido aclarados a comienzos de los anños 1980. Основные проблемы, связанные с эпохой неспособности к реляционному взаимодействию, составить "типы", es decir, Combinaciones de datos simples que соответствует una unidad. Actualmente estos son llamados objetos. Se esforzaron en introducir la menor cantidad posible de funcionalidades para Complete el soporte de tipos. Estas funcionalidades включает la habilidad de Definir tipos, pero también la habilidad de descriptionir relaciones - las cuales hasta ese momento eran ampiamente utilizadas pero mantenidas Complete por el usuario.En Postgres la base de datos «comprendía» las relaciones y podía obtener información de tablas relacionadas utilizando reglas . Postgres usó muchas ideas de Ingres pero no su código.
Список самых важных событий в истории проекта Postgres.
- 1986: опубликованы различные статьи, которые описывают все основы системы.
- 1988: ya se contaba con una versión utilizable.
- 1989: el grupo publicaba la versión 1 para una pequeña comunidad de usuarios.
- 1990: se publicaba la versión 2 la cual tenía prácticamente reescrito el sistema de reglas.
- 1991: publicación de la versión 3, esta añadía la Capacidad de múltiples motores de almacenamiento.
- 1993: Crecimiento importante de la comunidad de usuarios, la cual requireaba más características.
- 1994: después de la publicación de la versión 4, el proyecto terminó y el grupo se disolvió.
Después de que el proyecto POSTGRES terminara, dos Graduados de la Universidad, Andrew Yu y Jolly Chen, comenzaron a trabajar sobre el código de POSTGRES, esto fue posible dado que POSTGRES createda licenciado bajo fue la queD, y. añadir soporte for el lenguaje SQL a POSTGRES, dado que anteriormente contaba con un intérprete del lenguaje de consultas QUEL (basado en Ingres), Creando así el sistema al cual denominaron Postgres95.
Para el año 1996 se unieron al proyecto personas ajenas a la Universidad como Marc Fournier de Hub.Org Networking Services, Брюс Момджян и Вадим Б. Михеев quienes proporcionaron el primer servidor de desarrollo no universalitario para el esfuerzo de desarrollo no universalitario para el esfuerzo de comenzaron a trabajar para installilizar el código de Postgres95.
En el año 1996 decidieron cambiar el nombre de Postgres95 de tal modo que reflection la característica del lenguaje SQL y lo terminaron llamando PostgreSQL, cuya primera versión de código abierto fue lanzada el 1 de agosto de 1996.Начальная формальная версия PostgreSQL (6.0) является свободной от энергии 1997 года. Desde entonces, muchos desarrolladores entusiastas de los motores de base de datos se unieron al proyecto, координируется через Интернет и включает в себя все компоненты, которые включают в себя много автомобилей.
Доступно разрешение на коммерческое использование PostgreSQL, кодирование не требуется, чтобы оно было разрешено в соответствии с принципами коммерческого использования, а также действует с учетом требований к сервису PostgreSQL. Основное происхождение происходит от Паулы Хоторн (он представляет собой исходное происхождение от Ingres que se pasó a Postgres) и Майкл Стоунбрейкер соответствует Illustra Information Technologies для коммерческого использования Postgres.
En 2000, бывший инверсионист Red Hat создан для использования Great Bridge для коммерческого использования PostgreSQL и конкурирует с проверенными коммерческими базами данных. Great Bridge поддерживает различные варианты использования PostgreSQL и не требует повторных обращений к сообществу, в соответствии с штрафами 2001 года, которые подлежат проверке в соответствии с требованиями компании Red Hat и другими пользователями.
En 2001, Command Prompt, Inc., это Mammonth PostgreSQL, больше антигуа-распространителя PostgreSQL.Продолжайте поддерживать совместное использование PostgreSQL и проекты, включая PL / Perl, PL / php и другие проекты, связанные с PostgreSQL Build Farm.
En enero de 2005, PostgreSQL извлечен из базы данных Pervasive Software, создан на основе продукта Btrieve, который используется на платформе Novell Netware. Повсеместное сообщение о коммерческом сообщении и участии в сообществе и логике с открытым кодом. Sin embargo, en julio de 2006 dejó el mercado de soporte de PostgreSQL.