PL/pgSQL is a block
structured language. The complete text of a function
definition must be a block. A block is defined as:
[ <<label>> ]
[ DECLARE
declarations ]
BEGIN
statements
END;
Any statement in the statement section of a block
can be a sub-block. Sub-blocks can be used for
logical grouping or to localize variables to a small group
of statements.
The variables declared in the declarations section preceding a
block are initialized to their default values every time the
block is entered, not only once per function call. For example:
CREATE FUNCTION somefunc() RETURNS INTEGER AS '
DECLARE
quantity INTEGER := 30;
BEGIN
RAISE NOTICE ''Quantity here is %'',quantity; -- Quantity here is 30
quantity := 50;
--
-- Create a sub-block
--
DECLARE
quantity INTEGER := 80;
BEGIN
RAISE NOTICE ''Quantity here is %'',quantity; -- Quantity here is 80
END;
RAISE NOTICE ''Quantity here is %'',quantity; -- Quantity here is 50
RETURN quantity;
END;
' LANGUAGE 'plpgsql';
It is important not to confuse the use of BEGIN/END for
grouping statements in PL/pgSQL with the database commands for
transaction control. PL/pgSQL's BEGIN/END are only for grouping;
they do not start or end a transaction. Functions and trigger procedures
are always executed within a transaction established by an outer query
--- they cannot start or commit transactions, since
PostgreSQL does not have nested transactions.
Each statement and declaration within a block is terminated
by a semicolon.
All keywords and identifiers can be written in mixed upper- and
lower-case. Identifiers are implicitly converted to lower-case
unless double-quoted.
There are two types of comments in PL/pgSQL. A double dash --
starts a comment that extends to the end of the line. A /*
starts a block comment that extends to the next occurrence of */.
Block comments cannot be nested, but double dash comments can be
enclosed into a block comment and a double dash can hide
the block comment delimiters /* and */.