db=> \d r_locks                  Table "public.r_locks"  Column  |          Type           |     Modifiers       ---------+-------------------------+--------------------  code    | character varying(1024) | not null  version | numeric(38,0)           | not null default 1 Indexes:     "r_locks_pkey" PRIMARY KEY, btree (code) CREATE OR REPLACE FUNCTION public.get_r_lock(codein CHARACTER VARYING, exclusive BOOLEAN) RETURNS NUMERIC LANGUAGE plpgsql AS $function$ DECLARE ver NUMERIC; BEGIN IF exclusive THEN SELECT version FROM r_locks WHERE code = codeIn INTO ver FOR UPDATE; IF found THEN ver := ver + 1; UPDATE r_locks SET version = ver WHERE code = codeIn; END IF; ELSE BEGIN SELECT version FROM r_locks WHERE code = codeIn INTO ver FOR SHARE NOWAIT; EXCEPTION WHEN lock_not_available THEN RETURN -2; END; END IF; IF NOT found THEN RETURN -1; END IF; RETURN ver; END; $function$ create or replace function make_r_code(tagIn numeric, blockId numeric) returns varchar immutable as $$ begin if tagIn = 0 then return '-' || blockId; else return blockId || '-'; end if; end; $$ LANGUAGE plpgsql;