pg_dbms_lock

pg_dbms_lock

pg_dbms_lock : Extension to add Oracle DBMS_LOCK full compatibility to PostgreSQL

Overview

ID Extension Package Version Category License Language
9250
pg_dbms_lock
pg_dbms_lock
1.0
SIM
PostgreSQL
SQL
Attribute Has Binary Has Library Need Load Has DDL Relocatable Trusted
--s-d--
No
Yes
No
Yes
no
no
Relationships
Schemas dbms_lock
See Also
orafce
session_variable
pg_dbms_metadata
pg_dbms_job
oracle_fdw
pgtt
pg_statement_rollback
mysql_fdw

Packages

Type Repo Version PG Major Compatibility Package Pattern Dependencies
EXT
PGDG
1.0
18
17
16
15
14
pg_dbms_lock -
RPM
PGDG
1.0
18
17
16
15
14
pg_dbms_lock_$v -
Linux / PG PG18 PG17 PG16 PG15 PG14
el8.x86_64
PGDG 1.0
PGDG 1.0
PGDG 1.0
PGDG 1.0
PGDG 1.0
el8.aarch64
PGDG 1.0
PGDG 1.0
PGDG 1.0
PGDG 1.0
PGDG 1.0
el9.x86_64
PGDG 1.0
PGDG 1.0
PGDG 1.0
PGDG 1.0
PGDG 1.0
el9.aarch64
PGDG 1.0
PGDG 1.0
PGDG 1.0
PGDG 1.0
PGDG 1.0
el10.x86_64
PGDG 1.0
PGDG 1.0
PGDG 1.0
PGDG 1.0
PGDG 1.0
el10.aarch64
PGDG 1.0
PGDG 1.0
PGDG 1.0
PGDG 1.0
PGDG 1.0
d12.x86_64
MISS
MISS
MISS
MISS
MISS
d12.aarch64
MISS
MISS
MISS
MISS
MISS
d13.x86_64
MISS
MISS
MISS
MISS
MISS
d13.aarch64
MISS
MISS
MISS
MISS
MISS
u22.x86_64
MISS
MISS
MISS
MISS
MISS
u22.aarch64
MISS
MISS
MISS
MISS
MISS
u24.x86_64
MISS
MISS
MISS
MISS
MISS
u24.aarch64
MISS
MISS
MISS
MISS
MISS
Package Version OS ORG SIZE File URL
pg_dbms_lock_18 1.0 el8.x86_64 pgdg 12.7 KiB pg_dbms_lock_18-1.0-3PGDG.rhel8.noarch.rpm
pg_dbms_lock_18 1.0 el8.aarch64 pgdg 12.7 KiB pg_dbms_lock_18-1.0-3PGDG.rhel8.noarch.rpm
pg_dbms_lock_18 1.0 el9.x86_64 pgdg 12.6 KiB pg_dbms_lock_18-1.0-3PGDG.rhel9.noarch.rpm
pg_dbms_lock_18 1.0 el9.aarch64 pgdg 12.6 KiB pg_dbms_lock_18-1.0-3PGDG.rhel9.noarch.rpm
pg_dbms_lock_18 1.0 el10.x86_64 pgdg 13.1 KiB pg_dbms_lock_18-1.0-3PGDG.rhel10.noarch.rpm
pg_dbms_lock_18 1.0 el10.aarch64 pgdg 13.1 KiB pg_dbms_lock_18-1.0-3PGDG.rhel10.noarch.rpm
Package Version OS ORG SIZE File URL
pg_dbms_lock_17 1.0 el8.x86_64 pgdg 12.5 KiB pg_dbms_lock_17-1.0-1PGDG.rhel8.noarch.rpm
pg_dbms_lock_17 1.0 el8.aarch64 pgdg 12.5 KiB pg_dbms_lock_17-1.0-1PGDG.rhel8.noarch.rpm
pg_dbms_lock_17 1.0 el9.x86_64 pgdg 12.4 KiB pg_dbms_lock_17-1.0-1PGDG.rhel9.noarch.rpm
pg_dbms_lock_17 1.0 el9.aarch64 pgdg 12.4 KiB pg_dbms_lock_17-1.0-1PGDG.rhel9.noarch.rpm
pg_dbms_lock_17 1.0 el10.x86_64 pgdg 13.0 KiB pg_dbms_lock_17-1.0-2PGDG.rhel10.noarch.rpm
pg_dbms_lock_17 1.0 el10.aarch64 pgdg 13.0 KiB pg_dbms_lock_17-1.0-2PGDG.rhel10.noarch.rpm
Package Version OS ORG SIZE File URL
pg_dbms_lock_16 1.0 el8.x86_64 pgdg 12.5 KiB pg_dbms_lock_16-1.0-1PGDG.rhel8.noarch.rpm
pg_dbms_lock_16 1.0 el8.aarch64 pgdg 12.5 KiB pg_dbms_lock_16-1.0-1PGDG.rhel8.noarch.rpm
pg_dbms_lock_16 1.0 el9.x86_64 pgdg 12.4 KiB pg_dbms_lock_16-1.0-1PGDG.rhel9.noarch.rpm
pg_dbms_lock_16 1.0 el9.aarch64 pgdg 12.2 KiB pg_dbms_lock_16-1.0-1PGDG.rhel9.noarch.rpm
pg_dbms_lock_16 1.0 el10.x86_64 pgdg 13.0 KiB pg_dbms_lock_16-1.0-2PGDG.rhel10.noarch.rpm
pg_dbms_lock_16 1.0 el10.aarch64 pgdg 13.0 KiB pg_dbms_lock_16-1.0-2PGDG.rhel10.noarch.rpm
Package Version OS ORG SIZE File URL
pg_dbms_lock_15 1.0 el8.x86_64 pgdg 12.5 KiB pg_dbms_lock_15-1.0-1PGDG.rhel8.noarch.rpm
pg_dbms_lock_15 1.0 el8.aarch64 pgdg 12.5 KiB pg_dbms_lock_15-1.0-1PGDG.rhel8.noarch.rpm
pg_dbms_lock_15 1.0 el9.x86_64 pgdg 12.4 KiB pg_dbms_lock_15-1.0-1PGDG.rhel9.noarch.rpm
pg_dbms_lock_15 1.0 el9.aarch64 pgdg 12.2 KiB pg_dbms_lock_15-1.0-1PGDG.rhel9.noarch.rpm
pg_dbms_lock_15 1.0 el10.x86_64 pgdg 13.0 KiB pg_dbms_lock_15-1.0-2PGDG.rhel10.noarch.rpm
pg_dbms_lock_15 1.0 el10.aarch64 pgdg 13.0 KiB pg_dbms_lock_15-1.0-2PGDG.rhel10.noarch.rpm
Package Version OS ORG SIZE File URL
pg_dbms_lock_14 1.0 el8.x86_64 pgdg 12.5 KiB pg_dbms_lock_14-1.0-1PGDG.rhel8.noarch.rpm
pg_dbms_lock_14 1.0 el8.aarch64 pgdg 12.5 KiB pg_dbms_lock_14-1.0-1PGDG.rhel8.noarch.rpm
pg_dbms_lock_14 1.0 el9.x86_64 pgdg 12.4 KiB pg_dbms_lock_14-1.0-1PGDG.rhel9.noarch.rpm
pg_dbms_lock_14 1.0 el9.aarch64 pgdg 12.2 KiB pg_dbms_lock_14-1.0-1PGDG.rhel9.noarch.rpm
pg_dbms_lock_14 1.0 el10.x86_64 pgdg 13.0 KiB pg_dbms_lock_14-1.0-2PGDG.rhel10.noarch.rpm
pg_dbms_lock_14 1.0 el10.aarch64 pgdg 13.0 KiB pg_dbms_lock_14-1.0-2PGDG.rhel10.noarch.rpm

Source

Install

Make sure PGDG repo available:

pig repo add pgdg -u    # add pgdg repo and update cache

Install this extension with pig:

pig install pg_dbms_lock;		# install via package name, for the active PG version

pig install pg_dbms_lock -v 18;   # install for PG 18
pig install pg_dbms_lock -v 17;   # install for PG 17
pig install pg_dbms_lock -v 16;   # install for PG 16
pig install pg_dbms_lock -v 15;   # install for PG 15
pig install pg_dbms_lock -v 14;   # install for PG 14

Create this extension with:

CREATE EXTENSION pg_dbms_lock;

Usage

pg_dbms_lock: Extension to add Oracle DBMS_LOCK full compatibility to PostgreSQL

Uses PostgreSQL advisory locks to emulate Oracle DBMS_LOCK behavior.

Enabling

CREATE EXTENSION pg_dbms_lock;

ALLOCATE_UNIQUE

Allocate a unique lock identifier for a named lock:

DO $$
DECLARE
    lockhandle varchar;
BEGIN
    CALL dbms_lock.allocate_unique(
        lockname => 'printer_lock',
        lockhandle => lockhandle
    );
    RAISE NOTICE 'Handle: %', lockhandle;
END;
$$;

REQUEST

Request a lock with a specific mode (Exclusive=6, Shared=4):

DO $$
DECLARE
    lock_res int;
BEGIN
    lock_res := dbms_lock.request(
        id => 123,
        lockmode => 6,           -- Exclusive
        timeout => 300,
        release_on_commit => false
    );
    IF lock_res <> 0 THEN
        RAISE EXCEPTION 'Lock request failed: %', lock_res;
    END IF;
END;
$$;

Return values: 0=Success, 1=Timeout, 3=Parameter error, 4=Already own lock, 5=Illegal handle.

RELEASE

Explicitly release a previously acquired lock:

DO $$
DECLARE
    lock_res int;
BEGIN
    lock_res := dbms_lock.release(id => 123);
    IF lock_res <> 0 THEN
        RAISE EXCEPTION 'Release failed: %', lock_res;
    END IF;
END;
$$;

SLEEP

Suspend the session for a given duration:

CALL dbms_lock.sleep(0.70);  -- sleep 0.7 seconds

Complete Example

DO $$
DECLARE
    lock_res int;
    printer_lockhandle varchar;
BEGIN
    CALL dbms_lock.allocate_unique('printer_lock', printer_lockhandle);
    lock_res := dbms_lock.request(lockhandle => printer_lockhandle, lockmode => 6, timeout => 5);
    IF lock_res <> 0 THEN
        RAISE EXCEPTION 'REQUEST failed: %', lock_res;
    END IF;
    -- do exclusive work here
    lock_res := dbms_lock.release(lockhandle => printer_lockhandle);
END;
$$;
Last updated on