Генерация идентификатора пользователя посредством PL/PGSQL

Возможности реляционных баз данных PostgreSQL можно существенно расширить за счет процедур на специальном языке — PL/PSQL. Он очень прост, существует давно и поэтому весьма стабилен. Дополнительным удобством является то, что вызов процедуры — это транзакция, поэтому если при ее выполнении происходит какой-нибудь сбой, данные не теряются. Просто происходит откат к прежнему состоянию.

На PL/SQL можно не только производить действия с таблицами, но и писать программы, возвращающие те или иные значения. Вот как, например, можно генерировать идентификатор пользователя, построенный по принципу «3 буквы 6 цифр» (при этом, правда, должен поддерживаться тип данных uuid, но о нем в другой раз):

create or replace function new_uid() returns varchar(9) as $$
declare 
	new_uuid text := uuid_generate_v4();
	letters  text := regexp_replace(upper(new_uuid), '[0-9]|-', '', 'g');
	digits   text := regexp_replace(upper(new_uuid), '[A-Z]|-', '', 'g');
        uid_to_return varchar(9) := substring(letters from 1 for 3)||substring(digits from 1 for 6);
        rw users%rowtype;
begin   
        if uid_to_return !~ '[A-Z]{3}[0-9]{6}' then
              raise exception 'Какой-то херовенький идентификатор получился - %. Такое бывает редко, попробуйте еше раз.', uid_to_return;
        end if;
        select * from users where id = new_uuid into rw;
        if found then
              raise exception 'Пользователь с таким идентификатором уже есть в базе.';
        end if;
	return uid_to_return;
end
$$ language plpgsql;

Комментарии (1)

RSS свернуть / развернуть
+
0
Чем-то похоже на паскаль
avatar

Sergei_T

  • 16 декабря 2012, 19:34

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.