Advanced PL/pgSQL helps you write smarter and faster database programs. It lets you do more complex tasks inside the database, saving time and effort.
Why advanced PL/pgSQL matters in PostgreSQL
Start learning this pattern below
Jump into concepts and practice - no test required
or
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction
Syntax
PostgreSQL
CREATE OR REPLACE FUNCTION function_name(parameters) RETURNS return_type AS $$ DECLARE -- variable declarations BEGIN -- procedural code RETURN value; END; $$ LANGUAGE plpgsql;
Use
DECLARE to define variables you need inside the function.The
BEGIN ... END; block contains the main code that runs when the function is called.Examples
PostgreSQL
CREATE FUNCTION add_numbers(a integer, b integer) RETURNS integer AS $$ BEGIN RETURN a + b; END; $$ LANGUAGE plpgsql;
PostgreSQL
CREATE FUNCTION update_salary(emp_id integer, increase numeric) RETURNS void AS $$ BEGIN UPDATE employees SET salary = salary + increase WHERE id = emp_id; END; $$ LANGUAGE plpgsql;
Sample Program
This example creates a table, inserts two employees, defines a function to give a raise, calls it for Alice, and then shows the updated salaries.
PostgreSQL
CREATE TABLE employees (id serial PRIMARY KEY, name text, salary numeric); INSERT INTO employees (name, salary) VALUES ('Alice', 50000), ('Bob', 60000); CREATE OR REPLACE FUNCTION give_raise(emp_id integer, raise_amount numeric) RETURNS void AS $$ BEGIN UPDATE employees SET salary = salary + raise_amount WHERE id = emp_id; END; $$ LANGUAGE plpgsql; SELECT give_raise(1, 5000); SELECT id, name, salary FROM employees ORDER BY id;
Important Notes
PL/pgSQL lets you write code that runs inside the database, which can be faster than running many separate SQL commands.
Using functions helps keep your database logic organized and reusable.
Advanced PL/pgSQL skills let you handle errors and complex logic, making your database smarter.
Summary
Advanced PL/pgSQL helps automate and speed up database tasks.
It allows writing complex logic inside the database for better performance.
Functions and procedures keep your database code clean and reusable.
Practice
1. What is one main benefit of using advanced PL/pgSQL in PostgreSQL?
easy
Solution
Step 1: Understand PL/pgSQL purpose
PL/pgSQL is designed to write procedural code inside PostgreSQL to handle complex logic.Step 2: Identify the benefit
Writing logic inside the database improves performance by reducing data transfer and centralizing processing.Final Answer:
It allows writing complex logic inside the database for better performance. -> Option DQuick Check:
Advanced PL/pgSQL improves performance [OK]
Hint: Think about why logic inside DB helps speed [OK]
Common Mistakes:
- Thinking PL/pgSQL replaces all SQL queries
- Confusing PL/pgSQL with UI tools
- Assuming it disables transactions
2. Which of the following is the correct way to declare a variable in PL/pgSQL?
easy
Solution
Step 1: Recall PL/pgSQL variable declaration syntax
Variables are declared inside a DECLARE block with type and optional initialization.Step 2: Check each option
DECLARE myvar INTEGER := 10; correctly uses DECLARE, variable name, type, and initialization. Others have syntax errors.Final Answer:
DECLARE myvar INTEGER := 10; -> Option AQuick Check:
Variable declaration needs DECLARE and type [OK]
Hint: Remember DECLARE block is mandatory for variables [OK]
Common Mistakes:
- Omitting DECLARE keyword
- Placing type after initialization
- Using VAR instead of DECLARE
3. What will be the output of this PL/pgSQL function?
CREATE OR REPLACE FUNCTION add_numbers(a INTEGER, b INTEGER) RETURNS INTEGER AS $$ BEGIN RETURN a + b; END; $$ LANGUAGE plpgsql; SELECT add_numbers(3, 5);
medium
Solution
Step 1: Understand function logic
The function takes two integers and returns their sum using RETURN a + b.Step 2: Evaluate the SELECT call
Calling add_numbers(3, 5) returns 3 + 5 = 8.Final Answer:
8 -> Option AQuick Check:
3 + 5 = 8 [OK]
Hint: Add the two input numbers as the function returns sum [OK]
Common Mistakes:
- Concatenating numbers as strings
- Expecting syntax error due to missing semicolon
- Assuming NULL return without explicit return
4. Identify the error in this PL/pgSQL block:
DO $$ DECLARE counter INTEGER := 0 BEGIN counter := counter + 1; RAISE NOTICE 'Counter: %', counter; END; $$ LANGUAGE plpgsql;
medium
Solution
Step 1: Check variable declaration syntax
In PL/pgSQL, each statement must end with a semicolon. The declaration line lacks a semicolon.Step 2: Verify other parts
RAISE NOTICE syntax is correct, variable initialization is allowed, and LANGUAGE plpgsql is required.Final Answer:
Missing semicolon after variable declaration -> Option CQuick Check:
Statements must end with semicolon [OK]
Hint: Check semicolons after DECLARE lines [OK]
Common Mistakes:
- Ignoring missing semicolon errors
- Misreading RAISE NOTICE syntax
- Thinking variable initialization is disallowed
5. You want to create a PL/pgSQL function that returns the factorial of a number using recursion. Which of these function definitions correctly implements this?
hard
Solution
Step 1: Understand factorial base case
Factorial of 0 or 1 is 1, so base case must return 1 when n <= 1.Step 2: Check recursive call correctness
CREATE FUNCTION factorial(n INTEGER) RETURNS INTEGER AS $$ BEGIN IF n <= 1 THEN RETURN 1; ELSE RETURN n * factorial(n - 1); END IF; END; $$ LANGUAGE plpgsql; correctly returns 1 for base case and multiplies n by factorial(n-1) otherwise.Step 3: Identify errors in other options
CREATE FUNCTION factorial(n INTEGER) RETURNS INTEGER AS $$ BEGIN RETURN n * factorial(n - 1); END; $$ LANGUAGE plpgsql; lacks base case, causing infinite recursion. CREATE FUNCTION factorial(n INTEGER) RETURNS INTEGER AS $$ BEGIN IF n = 0 THEN RETURN 0; ELSE RETURN n * factorial(n - 1); END IF; END; $$ LANGUAGE plpgsql; returns 0 for n=0, which is incorrect. CREATE FUNCTION factorial(n INTEGER) RETURNS INTEGER AS $$ BEGIN WHILE n > 1 LOOP RETURN n * factorial(n - 1); END LOOP; END; $$ LANGUAGE plpgsql; misuses WHILE loop and RETURN inside loop.Final Answer:
Correctly implements recursive factorial with base case and recursion. -> Option BQuick Check:
Base case + recursion needed for factorial [OK]
Hint: Always include base case in recursion [OK]
Common Mistakes:
- Missing base case causing infinite recursion
- Returning wrong value for factorial(0)
- Using loops incorrectly with RETURN inside
