Skip to content
pg_dbms_lock

pg_dbms_lock

pg_dbms_lock : Extension to add Oracle DBMS_LOCK full compatibility to PostgreSQL

Overview

IDExtensionPackageVersionCategoryLicenseLanguage
9250
pg_dbms_lock
pg_dbms_lock
2.0
SIM
PostgreSQL
SQL
AttributeHas BinaryHas LibraryNeed LoadHas DDLRelocatableTrusted
----d--
No
No
No
Yes
no
no
Relationships
Schemasdbms_lock
Requires
pg_background
See Also
orafce
session_variable
pg_dbms_metadata
pg_dbms_job
oracle_fdw
pgtt
pg_statement_rollback
mysql_fdw

Requires pg_background >= 2.0; the PIGSTY DEB carries a downstream pg_background v2 API compatibility patch.

Packages

TypeRepoVersionPG Major CompatibilityPackage PatternDependencies
EXT
MIXED
2.0
18
17
16
15
14
pg_dbms_lockpg_background
RPM
PGDG
2.0
18
17
16
15
14
pg_dbms_lock_$vpg_background_$v
DEB
PIGSTY
2.0
18
17
16
15
14
postgresql-$v-pg-dbms-lockpostgresql-$v-pg-background
Linux / PGPG18PG17PG16PG15PG14
el8.x86_64
PGDG 2.0
PGDG 2.0
PGDG 2.0
PGDG 2.0
PGDG 2.0
el8.aarch64
PGDG 2.0
PGDG 2.0
PGDG 2.0
PGDG 2.0
PGDG 2.0
el9.x86_64
PGDG 2.0
PGDG 2.0
PGDG 2.0
PGDG 2.0
PGDG 2.0
el9.aarch64
PGDG 2.0
PGDG 2.0
PGDG 2.0
PGDG 2.0
PGDG 2.0
el10.x86_64
PGDG 2.0
PGDG 2.0
PGDG 2.0
PGDG 2.0
PGDG 2.0
el10.aarch64
PGDG 2.0
PGDG 2.0
PGDG 2.0
PGDG 2.0
PGDG 2.0
d12.x86_64
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0
d12.aarch64
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0
d13.x86_64
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0
d13.aarch64
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0
u22.x86_64
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0
u22.aarch64
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0
u24.x86_64
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0
u24.aarch64
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0
u26.x86_64
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0
u26.aarch64
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0
PIGSTY 2.0
PackageVersionOSORGSIZEFile URL
pg_dbms_lock_182.0el8.x86_64pgdg13.1 KiBpg_dbms_lock_18-2.0-1PGDG.rhel8.10.noarch.rpm
pg_dbms_lock_181.0el8.x86_64pgdg12.7 KiBpg_dbms_lock_18-1.0-3PGDG.rhel8.noarch.rpm
pg_dbms_lock_182.0el8.aarch64pgdg13.1 KiBpg_dbms_lock_18-2.0-1PGDG.rhel8.10.noarch.rpm
pg_dbms_lock_181.0el8.aarch64pgdg12.7 KiBpg_dbms_lock_18-1.0-3PGDG.rhel8.noarch.rpm
pg_dbms_lock_182.0el9.x86_64pgdg12.9 KiBpg_dbms_lock_18-2.0-1PGDG.rhel9.8.noarch.rpm
pg_dbms_lock_181.0el9.x86_64pgdg12.6 KiBpg_dbms_lock_18-1.0-3PGDG.rhel9.8.noarch.rpm
pg_dbms_lock_181.0el9.x86_64pgdg12.6 KiBpg_dbms_lock_18-1.0-3PGDG.rhel9.noarch.rpm
pg_dbms_lock_182.0el9.aarch64pgdg12.9 KiBpg_dbms_lock_18-2.0-1PGDG.rhel9.8.noarch.rpm
pg_dbms_lock_181.0el9.aarch64pgdg12.6 KiBpg_dbms_lock_18-1.0-3PGDG.rhel9.8.noarch.rpm
pg_dbms_lock_181.0el9.aarch64pgdg12.6 KiBpg_dbms_lock_18-1.0-3PGDG.rhel9.noarch.rpm
pg_dbms_lock_182.0el10.x86_64pgdg13.1 KiBpg_dbms_lock_18-2.0-1PGDG.rhel10.2.noarch.rpm
pg_dbms_lock_181.0el10.x86_64pgdg12.8 KiBpg_dbms_lock_18-1.0-3PGDG.rhel10.2.noarch.rpm
pg_dbms_lock_181.0el10.x86_64pgdg13.1 KiBpg_dbms_lock_18-1.0-3PGDG.rhel10.noarch.rpm
pg_dbms_lock_182.0el10.aarch64pgdg13.0 KiBpg_dbms_lock_18-2.0-1PGDG.rhel10.2.noarch.rpm
pg_dbms_lock_181.0el10.aarch64pgdg12.7 KiBpg_dbms_lock_18-1.0-3PGDG.rhel10.2.noarch.rpm
pg_dbms_lock_181.0el10.aarch64pgdg13.1 KiBpg_dbms_lock_18-1.0-3PGDG.rhel10.noarch.rpm
postgresql-18-pg-dbms-lock2.0d12.x86_64pigsty8.7 KiBpostgresql-18-pg-dbms-lock_2.0-1PIGSTY~bookworm_all.deb
postgresql-18-pg-dbms-lock2.0d12.aarch64pigsty8.7 KiBpostgresql-18-pg-dbms-lock_2.0-1PIGSTY~bookworm_all.deb
postgresql-18-pg-dbms-lock2.0d13.x86_64pigsty8.7 KiBpostgresql-18-pg-dbms-lock_2.0-1PIGSTY~trixie_all.deb
postgresql-18-pg-dbms-lock2.0d13.aarch64pigsty8.7 KiBpostgresql-18-pg-dbms-lock_2.0-1PIGSTY~trixie_all.deb
postgresql-18-pg-dbms-lock2.0u22.x86_64pigsty8.8 KiBpostgresql-18-pg-dbms-lock_2.0-1PIGSTY~jammy_all.deb
postgresql-18-pg-dbms-lock2.0u22.aarch64pigsty8.8 KiBpostgresql-18-pg-dbms-lock_2.0-1PIGSTY~jammy_all.deb
postgresql-18-pg-dbms-lock2.0u24.x86_64pigsty8.8 KiBpostgresql-18-pg-dbms-lock_2.0-1PIGSTY~noble_all.deb
postgresql-18-pg-dbms-lock2.0u24.aarch64pigsty8.8 KiBpostgresql-18-pg-dbms-lock_2.0-1PIGSTY~noble_all.deb
postgresql-18-pg-dbms-lock2.0u26.x86_64pigsty8.9 KiBpostgresql-18-pg-dbms-lock_2.0-1PIGSTY~resolute_all.deb
postgresql-18-pg-dbms-lock2.0u26.aarch64pigsty8.9 KiBpostgresql-18-pg-dbms-lock_2.0-1PIGSTY~resolute_all.deb

Source

pig build pkg pg_dbms_lock;		# build deb

Install

Make sure PGDG and PIGSTY repo available:

pig repo add pgsql -u   # add both 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 CASCADE; -- requires pg_background

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