--- title: "PL/pgSQL — SQL Procedural Language" id: plpgsql pg_version: "20devel" --- # PL/pgSQL — SQL Procedural Language ## Table of Contents - [41.1. Overview](plpgsql-overview.md) - [41.1.1. Advantages of Using PL/pgSQL](plpgsql-overview.md#plpgsql-advantages) - [41.1.2. Supported Argument and Result Data Types](plpgsql-overview.md#plpgsql-args-results) - [41.2. Structure of PL/pgSQL](plpgsql-structure.md) - [41.3. Declarations](plpgsql-declarations.md) - [41.3.1. Declaring Function Parameters](plpgsql-declarations.md#plpgsql-declaration-parameters) - [41.3.2. `ALIAS`](plpgsql-declarations.md#plpgsql-declaration-alias) - [41.3.3. Copying Types](plpgsql-declarations.md#plpgsql-declaration-type) - [41.3.4. Row Types](plpgsql-declarations.md#plpgsql-declaration-rowtypes) - [41.3.5. Record Types](plpgsql-declarations.md#plpgsql-declaration-records) - [41.3.6. Collation of PL/pgSQL Variables](plpgsql-declarations.md#plpgsql-declaration-collation) - [41.4. Expressions](plpgsql-expressions.md) - [41.5. Basic Statements](plpgsql-statements.md) - [41.5.1. Assignment](plpgsql-statements.md#plpgsql-statements-assignment) - [41.5.2. Executing SQL Commands](plpgsql-statements.md#plpgsql-statements-general-sql) - [41.5.3. Executing a Command with a Single-Row Result](plpgsql-statements.md#plpgsql-statements-sql-onerow) - [41.5.4. Executing Dynamic Commands](plpgsql-statements.md#plpgsql-statements-executing-dyn) - [41.5.5. Obtaining the Result Status](plpgsql-statements.md#plpgsql-statements-diagnostics) - [41.5.6. Doing Nothing At All](plpgsql-statements.md#plpgsql-statements-null) - [41.6. Control Structures](plpgsql-control-structures.md) - [41.6.1. Returning from a Function](plpgsql-control-structures.md#plpgsql-statements-returning) - [41.6.2. Returning from a Procedure](plpgsql-control-structures.md#plpgsql-statements-returning-procedure) - [41.6.3. Calling a Procedure](plpgsql-control-structures.md#plpgsql-statements-calling-procedure) - [41.6.4. Conditionals](plpgsql-control-structures.md#plpgsql-conditionals) - [41.6.5. Simple Loops](plpgsql-control-structures.md#plpgsql-control-structures-loops) - [41.6.6. Looping through Query Results](plpgsql-control-structures.md#plpgsql-records-iterating) - [41.6.7. Looping through Arrays](plpgsql-control-structures.md#plpgsql-foreach-array) - [41.6.8. Trapping Errors](plpgsql-control-structures.md#plpgsql-error-trapping) - [41.6.9. Obtaining Execution Location Information](plpgsql-control-structures.md#plpgsql-call-stack) - [41.7. Cursors](plpgsql-cursors.md) - [41.7.1. Declaring Cursor Variables](plpgsql-cursors.md#plpgsql-cursor-declarations) - [41.7.2. Opening Cursors](plpgsql-cursors.md#plpgsql-cursor-opening) - [41.7.3. Using Cursors](plpgsql-cursors.md#plpgsql-cursor-using) - [41.7.4. Looping through a Cursor's Result](plpgsql-cursors.md#plpgsql-cursor-for-loop) - [41.8. Transaction Management](plpgsql-transactions.md) - [41.9. Errors and Messages](plpgsql-errors-and-messages.md) - [41.9.1. Reporting Errors and Messages](plpgsql-errors-and-messages.md#plpgsql-statements-raise) - [41.9.2. Checking Assertions](plpgsql-errors-and-messages.md#plpgsql-statements-assert) - [41.10. Trigger Functions](plpgsql-trigger.md) - [41.10.1. Triggers on Data Changes](plpgsql-trigger.md#plpgsql-dml-trigger) - [41.10.2. Triggers on Events](plpgsql-trigger.md#plpgsql-event-trigger) - [41.11. PL/pgSQL under the Hood](plpgsql-implementation.md) - [41.11.1. Variable Substitution](plpgsql-implementation.md#plpgsql-var-subst) - [41.11.2. Plan Caching](plpgsql-implementation.md#plpgsql-plan-caching) - [41.12. Tips for Developing in PL/pgSQL](plpgsql-development-tips.md) - [41.12.1. Handling of Quotation Marks](plpgsql-development-tips.md#plpgsql-quote-tips) - [41.12.2. Additional Compile-Time and Run-Time Checks](plpgsql-development-tips.md#plpgsql-extra-checks) - [41.13. Porting from Oracle PL/SQL](plpgsql-porting.md) - [41.13.1. Porting Examples](plpgsql-porting.md#plpgsql-porting-examples) - [41.13.2. Other Things to Watch For](plpgsql-porting.md#plpgsql-porting-other) - [41.13.3. Appendix](plpgsql-porting.md#plpgsql-porting-appendix)