Chapter 41. PL/pgSQL — SQL Procedural Language Table of Contents 41.1. Overview 41.1.1. Advantages of Using PL/pgSQL 41.1.2. Supported Argument and Result Data Types 41.2. Structure of PL/pgSQL 41.3. Declarations 41.3.1. Declaring Function Parameters 41.3.2. ALIAS 41.3.3. Copying Types 41.3.4. Row Types 41.3.5. Record Types 41.3.6. Collation of PL/pgSQL Variables 41.4. Expressions 41.5. Basic Statements 41.5.1. Assignment 41.5.2. Executing SQL Commands 41.5.3. Executing a Command with a Single-Row Result 41.5.4. Executing Dynamic Commands 41.5.5. Obtaining the Result Status 41.5.6. Doing Nothing At All 41.6. Control Structures 41.6.1. Returning from a Function 41.6.2. Returning from a Procedure 41.6.3. Calling a Procedure 41.6.4. Conditionals 41.6.5. Simple Loops 41.6.6. Looping through Query Results 41.6.7. Looping through Arrays 41.6.8. Trapping Errors 41.6.9. Obtaining Execution Location Information 41.7. Cursors 41.7.1. Declaring Cursor Variables 41.7.2. Opening Cursors 41.7.3. Using Cursors 41.7.4. Looping through a Cursor's Result 41.8. Transaction Management 41.9. Errors and Messages 41.9.1. Reporting Errors and Messages 41.9.2. Checking Assertions 41.10. Trigger Functions 41.10.1. Triggers on Data Changes 41.10.2. Triggers on Events 41.11. PL/pgSQL under the Hood 41.11.1. Variable Substitution 41.11.2. Plan Caching 41.12. Tips for Developing in PL/pgSQL 41.12.1. Handling of Quotation Marks 41.12.2. Additional Compile-Time and Run-Time Checks 41.13. Porting from Oracle PL/SQL 41.13.1. Porting Examples 41.13.2. Other Things to Watch For 41.13.3. Appendix