Sling Academy
Home/PostgreSQL/How to Use Loops in PostgreSQL (with Examples)

How to Use Loops in PostgreSQL (with Examples)

Last updated: January 28, 2024

Overview

Loops are a fundamental concept in any programming language, including SQL procedural languages. In PostgreSQL, the PL/pgSQL procedural language provides several looping constructs that resemble those in traditional programming languages like Python or Java. This article guides you through the use of loops in PostgreSQL with practical examples.

What is PL/pgSQL?

PL/pgSQL is a procedural language supported by the PostgreSQL database management system. It extends the standard SQL language with control structures, variables, and other programming language features. Loops in PL/pgSQL help you execute a block of statements repeatedly.

Types of Loops in PL/pgSQL

  • FOR LOOP: Iterates over a range of integers or over the rows returned by a SELECT query.
  • WHILE LOOP: Continues executing as long as a specified condition is true.
  • LOOP: An unconditional loop that needs an explicit exit condition inside the loop body.

Using FOR LOOP

A FOR LOOP can be used to iterate through a sequence of numbers or to loop over the results of a query. Here are the basic syntaxes:

-- Looping over a range
FOR i IN 1..10 LOOP
  -- Body of the loop
END LOOP;

-- Looping over a query result
FOR record IN SELECT * FROM my_table LOOP
  -- Body of the loop using the record
END LOOP;

Example 1: Basic FOR LOOP Over Range

Let’s say we want to create a table that logs numbers from 1 to 5:

BEGIN;
DO $
DECLARE
  i INT;
BEGIN
  CREATE TABLE logs (log INT);
  FOR i IN 1..5 LOOP
    INSERT INTO logs VALUES (i);
  END LOOP;
END;
$;
COMMIT;

This will create a logs table and insert five rows into it with values from 1 to 5.

Example 2: FOR LOOP Over Query Results

Consider a scenario where you want to log the names of all employees from a table ’employees’ into another table ’employee_logs’:

BEGIN;
DO $
DECLARE
  employee RECORD;
BEGIN
  CREATE TABLE employee_logs (name TEXT);
  FOR employee IN SELECT name FROM employees LOOP
    INSERT INTO employee_logs VALUES (employee.name);
  END LOOP;
END;
$;
COMMIT;

Each name from the ’employees’ table is inserted into the ’employee_logs’ table.

Using WHILE LOOP

A WHILE LOOP continues until the specified condition is false. Here’s the syntax for a WHILE LOOP:

WHILE condition LOOP
  -- statements to execute
END LOOP;

Example 3: WHILE LOOP in Action

If you wish to insert records until a certain condition is met, you could use a WHILE LOOP. For example, inserting numbers into a table until the sum of all numbers is greater than 100:

BEGIN;
DO $
DECLARE
  sum INT := 0;
  i INT := 1;
BEGIN
  CREATE TABLE sum_logs (number INT);
  WHILE sum < 100 LOOP
    sum := sum + i;
    INSERT INTO sum_logs VALUES (i);
    i := i + 1;
  END LOOP;
END;
$;
COMMIT;

Using LOOP

The basic LOOP structure has no condition to start; it needs an EXIT statement to terminate the loop. Syntax:

LOOP
  -- statements
  EXIT WHEN condition;
END LOOP;

Example 4: Basic LOOP with EXIT

To continue the previous example, but using a basic LOOP structure, you would write:

BEGIN;
DO $
DECLARE
  sum INT := 0;
  i INT := 1;
BEGIN
  CREATE TABLE sum_logs (number INT);
  LOOP
    EXIT WHEN sum >= 100;
    sum := sum + i;
    INSERT INTO sum_logs VALUES (i);
    i := i + 1;
  END LOOP;
END;
$;
COMMIT;

Conclusion

In this article, we have explored the various types of loops available in PostgreSQL using PL/pgSQL. Understanding these constructs empowers you to write more efficient and cleaner code by repeating tasks without writing the same SQL commands over and over. Remember, while loops can simplify tasks, they can potentially lead to long-running transactions, so use them judiciously and always ensure you have an exit condition set to prevent indefinite loops.

With these examples, you should have a good foundation to start implementing loops in PostgreSQL. As you practice, you’ll find that these tools can handle a vast array of tasks within your databases, making your PostgreSQL-related code more robust and easier to maintain.

Next Article: How to Run PostgreSQL on a Custom Port

Previous Article: PostgreSQL: Efficiently count rows in an extremely large table

Series: PostgreSQL Tutorials: From Basic to Advanced

PostgreSQL

You May Also Like

  • PostgreSQL with TimescaleDB: Querying Time-Series Data with SQL
  • PostgreSQL Full-Text Search with Boolean Operators
  • Filtering Stop Words in PostgreSQL Full-Text Search
  • PostgreSQL command-line cheat sheet
  • How to Perform Efficient Rolling Aggregations with TimescaleDB
  • PostgreSQL with TimescaleDB: Migrating from Traditional Relational Models
  • Best Practices for Maintaining PostgreSQL and TimescaleDB Databases
  • PostgreSQL with TimescaleDB: Building a High-Performance Analytics Engine
  • Integrating PostgreSQL and TimescaleDB with Machine Learning Models
  • PostgreSQL with TimescaleDB: Implementing Temporal Data Analysis
  • Combining PostgreSQL, TimescaleDB, and Airflow for Data Workflows
  • PostgreSQL with TimescaleDB: Visualizing Real-Time Data with Superset
  • Using PostgreSQL with TimescaleDB for Energy Consumption Analysis
  • PostgreSQL with TimescaleDB: How to Query Massive Datasets Efficiently
  • Best Practices for Writing Time-Series Queries in PostgreSQL with TimescaleDB
  • PostgreSQL with TimescaleDB: Implementing Batch Data Processing
  • Using PostgreSQL with TimescaleDB for Network Traffic Analysis
  • PostgreSQL with TimescaleDB: Troubleshooting Common Performance Issues
  • Building an IoT Data Pipeline with PostgreSQL and TimescaleDB