Updated November, 23 2023

PL/SQL#

Block#

We wrap anonymous blocks with DO $$ ... $$ and for procedures and functions we wrap the bodies with $$...$$ LANGUAGE plpgsql.

 1--Oracle
 2
 3--Anonimus blocks
 4DECLARE
 5BEGIN
 6   ...
 7END;
 8
 9
10--Functions
11CREATE OR REPLACE FUNCTION f (...)
12  RETURN <ret_type>
13IS
14BEGIN
15 ...
16END;
17
18
19--Procedures
20CREATE OR REPLACE PROCEDURE p (...)
21IS
22BEGIN
23  ...
24END;

Procedures call#

We just added CALL keyword before calling procedures in the PL/PGSQL block.

%TYPE attribute#

Postgres can handle this almost like Oracle does, but it has a few limitations. Postgres cannot use %TYPE attribute in the column definition of table or type. So we substitute %TYPE attribute with the real column type by getting the column’s metadata from DB in this case.

SELECT INTO#

To ensure that we select only one row and that any related error is generated if we do not, we use the STRICT keyword.

PL/SQL Blocks#

We label each PL/SQL block with the next id <<lbr$block$COUNTER>> COUNTER- is a number from 0 to blocks count. We don’t label function blocks.