Navigation : PostgreSQL 10.23 Documentation > Chapter 42. PL/pgSQL - SQL Procedural Language Chapter 42. PL/pgSQL - SQL Procedural Language Chapter 42. PL/pgSQL - SQL Procedural Language Prev Up Part V. Server Programming Home Next Table of Contents 42.1. Overview 42.1.1. Advantages of Using PL/pgSQL 42.1.2. Supported Argument and Result Data Types 42.2. Structure of PL/pgSQL 42.3. Declarations 42.3.1. Declaring Function Parameters 42.3.2. ALIAS 42.3.3. Copying Types 42.3.4. Row Types 42.3.5. Record Types 42.3.6. Collation of PL/pgSQL Variables 42.4. Expressions 42.5. Basic Statements 42.5.1. Assignment 42.5.2. Executing a Command With No Result 42.5.3. Executing a Query with a Single-row Result 42.5.4. Executing Dynamic Commands 42.5.5. Obtaining the Result Status 42.5.6. Doing Nothing At All 42.6. Control Structures 42.6.1. Returning From a Function 42.6.2. Conditionals 42.6.3. Simple Loops 42.6.4. Looping Through Query Results 42.6.5. Looping Through Arrays 42.6.6. Trapping Errors 42.6.7. Obtaining Execution Location Information 42.7. Cursors 42.7.1. Declaring Cursor Variables 42.7.2. Opening Cursors 42.7.3. Using Cursors 42.7.4. Looping Through a Cursor's Result 42.8. Errors and Messages 42.8.1. Reporting Errors and Messages 42.8.2. Checking Assertions 42.9. Trigger Procedures 42.9.1. Triggers on Data Changes 42.9.2. Triggers on Events 42.10. PL/pgSQL Under the Hood 42.10.1. Variable Substitution 42.10.2. Plan Caching 42.11. Tips for Developing in PL/pgSQL 42.11.1. Handling of Quotation Marks 42.11.2. Additional Compile-time Checks 42.12. Porting from Oracle PL/SQL 42.12.1. Porting Examples 42.12.2. Other Things to Watch For 42.12.3. Appendix