DEV Community

Super Kai (Kazuya Ito)
Super Kai (Kazuya Ito)

Posted on • Updated on

Declarations in PostgreSQL

You can declare local variables with :=, = in DECLARE clause as shown below:

CREATE FUNCTION my_func()
RETURNS INT
AS $$
DECLARE
  value1 INT := 1; -- Here
  value2 INT = 2; -- Here
  value3 INT DEFAULT 3; -- Here
  value4 CONSTANT INT := 4; -- Here
  value5 INT; -- Here
BEGIN
  RETURN value1 + value2 + value3;
END;
$$ LANGUAGE plpgsql;
Enter fullscreen mode Exit fullscreen mode

*Memos:

  • :=, = and DEFAULT are the same.
  • Trying to change the constant local variable value4 gets error.
  • The uninitialized local variable value5 is NULL.
  • You can declare local variables with DECLARE clause in a PL/pgSQL function and procedure.

*The doc explains declarations.

Then, calling my_func() returns 6 as shown below:

postgres=# SELECT my_func();
 my_func
---------
       6
(1 row)
Enter fullscreen mode Exit fullscreen mode

Next, you can declare local variables with parameters in DECLARE clause as shown below:

CREATE FUNCTION my_func(num1 INT, INT, num3 INT)
RETURNS INT
AS $$
DECLARE
  value1 INT := $1; -- Here
  value2 INT := $2; -- Here
  value3 INT := num3; -- Here
BEGIN
  RETURN value1 + value2 + value3;
END;
$$ LANGUAGE plpgsql;
Enter fullscreen mode Exit fullscreen mode

*Memos:

  • A type-only parameter is possible like the middle parameter INT.

  • Using $1 and $2 as the aliases of the parameters num1 INT and INT(The middle parameter) respectively is possible.

Then, calling my_func() returns 6 as shown below:

postgres=# SELECT my_func(1, 2, 3);
 my_func
---------
       6
(1 row)
Enter fullscreen mode Exit fullscreen mode

Next, you can declare aliases with ALIAS FOR in DECLARE clause as shown below:

CREATE FUNCTION my_func(num1 INT, INT, num3 INT)
RETURNS INT
AS $$
DECLARE
  value1 ALIAS FOR $1; -- Here
  value2 ALIAS FOR $2; -- Here
  value3 ALIAS FOR num3; -- Here
BEGIN
  RETURN value1 + value2 + value3;
END;
$$ LANGUAGE plpgsql;
Enter fullscreen mode Exit fullscreen mode

*Memos:

  • You cannot specify type for aliases otherwise there is error.

  • You can declare aliases with DECLARE clause in a PL/pgSQL function and procedure.

Then, calling my_func() returns 6 as shown below:

postgres=# SELECT my_func(1, 2, 3);
 my_func
---------
       6
(1 row)
Enter fullscreen mode Exit fullscreen mode

Next for example, you create person table as shown below:

CREATE TABLE person (
  id INT,
  name VARCHAR(20)
);
Enter fullscreen mode Exit fullscreen mode

Then, you insert 2 rows into person table as shown below:

INSERT INTO person (id, name) 
VALUES (1, 'John'), (2, 'David');
Enter fullscreen mode Exit fullscreen mode

Then, you can declare the local variables of table columns' types in DECLARE clause as shown below:

CREATE FUNCTION my_func()
RETURNS VARCHAR(20)
AS $$
DECLARE
  person_id public.person.id%TYPE := 2; -- Here
  person_name public.person.name%TYPE; -- Here
BEGIN
  SELECT name INTO person_name FROM person WHERE id = person_id;
  RETURN person_name;
END;
$$ LANGUAGE plpgsql;
Enter fullscreen mode Exit fullscreen mode

*Memos:

  • You can omit the schema public..

  • You must set %TYPE just after public.person.<column> otherwise there is error.

  • You can replace RETURNS VARCHAR(20) with RETURNS VARCHAR.

  • The doc explains the local variables of table columns' types.

Then, calling my_func() returns David as shown below:

postgres=# SELECT my_func();
 my_func
---------
 David
(1 row)
Enter fullscreen mode Exit fullscreen mode

And, you can declare the local variable of a table row type in DECLARE clause as shown below:

CREATE FUNCTION my_func()
RETURNS person
AS $$
DECLARE
  person_row public.person%ROWTYPE; -- Here
  -- person_row RECORD; -- Here
BEGIN
  SELECT * INTO person_row FROM person WHERE id = 2;
  RETURN person_row;
END;
$$ LANGUAGE plpgsql;
Enter fullscreen mode Exit fullscreen mode

*Memos:

  • You can omit the schema public. and %ROWTYPE.

  • You can also use person_row RECORD;.

  • You can replace RETURNS person with RETURNS RECORD.

  • The doc explains the local variable of a table row type.

Then, calling my_func() returns a row as shown below:

postgres=# SELECT my_func();
  my_func
-----------
 (2,David)
(1 row)
Enter fullscreen mode Exit fullscreen mode

Top comments (0)