DEV Community

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

Posted on • Edited on

Declarations in PostgreSQL

Buy Me a Coffee

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

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs