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.
When you want to automate repetitive database tasks like updating many rows.
When you need to run complex calculations or logic that SQL alone can't handle easily.
When you want to improve performance by running code close to the data inside the database.
When you want to create reusable functions or procedures to keep your database organized.
When you need to handle errors and control the flow of your database operations.
Syntax
PostgreSQL
CREATEOR 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
This simple function adds two numbers and returns the result.
PostgreSQL
CREATE FUNCTION add_numbers(a integer, b integer) RETURNS integer AS $$
BEGIN
RETURN a + b;
END;
$$ LANGUAGE plpgsql;
This function updates an employee's salary by adding an increase amount.
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
CREATETABLE employees (id serialPRIMARYKEY, name text, salary numeric);
INSERTINTO employees (name, salary) VALUES ('Alice', 50000), ('Bob', 60000);
CREATEOR 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 ORDERBY id;
OutputSuccess
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/5)
1. What is one main benefit of using advanced PL/pgSQL in PostgreSQL?
easy
A. It replaces the need for any SQL queries.
B. It disables database transactions.
C. It automatically creates user interfaces.
D. It allows writing complex logic inside the database for better performance.
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 D
Quick 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?
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 A
Quick 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
A. 8
B. 35
C. Syntax error
D. NULL
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 A
Quick 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
A. Variable counter cannot be initialized
B. RAISE NOTICE syntax is incorrect
C. Missing semicolon after variable declaration
D. LANGUAGE plpgsql is not allowed in DO blocks
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 C
Quick 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
A. CREATE FUNCTION factorial(n INTEGER) RETURNS INTEGER AS $$ BEGIN RETURN n * factorial(n - 1); END; $$ LANGUAGE plpgsql;
B. 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;
C. 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;
D. CREATE FUNCTION factorial(n INTEGER) RETURNS INTEGER AS $$ BEGIN WHILE n > 1 LOOP RETURN n * factorial(n - 1); END LOOP; END; $$ LANGUAGE plpgsql;
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 B
Quick 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
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.