sql >> Database >  >> RDS >> PostgreSQL

Worden opgeslagen procedures uitgevoerd in databasetransacties in Postgres?

Strikt genomen had Postgres geen opgeslagen procedures zoals gedefinieerd in de ISO/IEC-standaard vóór versie 11. De term wordt vaak verkeerd gebruikt om te verwijzen naar functies , die veel van dezelfde functionaliteit (en meer) bieden als andere RDBMS met "opgeslagen procedures". Het belangrijkste verschil is de afhandeling van transacties.

  • Wat zijn de verschillen tussen "Opgeslagen procedures" en "Opgeslagen functies"?

Echte opgeslagen procedures zijn eindelijk geïntroduceerd met Postgres 11:

  • Wanneer gebruik je de opgeslagen procedure/door de gebruiker gedefinieerde functie?

Functies zijn atomair in Postgres en worden automatisch uitgevoerd in hun eigen transactie, tenzij ze worden aangeroepen binnen een externe transactie. Ze draaien altijd binnen een enkele transactie en slagen of mislukken volledig . Bijgevolg kan men geen transacties starten of vastleggen binnen de functie. En commando's zoals VACUUM , CREATE DATABASE , of CREATE INDEX CONCURRENTLY die niet in een transactiecontext draaien, zijn niet toegestaan.

De handleiding over PL/pgSQL:

Functies en triggerprocedures worden altijd uitgevoerd binnen een transactie die tot stand is gebracht door een externe query — ze kunnen die transactie niet starten of uitvoeren, omdat er geen context voor hen zou zijn om in uit te voeren. Echter, een blok met een EXCEPTION clausule vormt effectief een subtransactie die kan worden teruggedraaid zonder de buitenste transactie te beïnvloeden.

Foutafhandeling:

Standaard breekt elke fout die optreedt in een PL/pgSQL-functie de uitvoering van de functie af, en inderdaad ook van de omringende transactie. U kunt fouten onderscheppen en ze herstellen door een BEGIN . te gebruiken blok met een EXCEPTION clausule.

Er zijn uitzonderingen , inclusief maar niet beperkt tot:

  • gegevens geschreven naar logbestanden
  • wijzigingen aangebracht in een reeks

    Belangrijk :Sommige PostgreSQL-gegevenstypen en -functies hebben speciale regels met betrekking tot transactiegedrag. Met name wijzigingen die zijn aangebracht in de volgorde (en dus de teller van een kolom die is gedeclareerd met behulp van serial )zijn onmiddellijk zichtbaar voor alle andere transacties en worden niet teruggedraaid als de transactie die de wijzigingen heeft aangebracht, wordt afgebroken.

  • voorbereide verklaringen

    • SQL Fiddle-demo
  • dblink-oproepen (of vergelijkbaar)

    • Ondersteunt Postgres geneste of autonome transacties?


  1. Retour-ID als een rij bestaat, anders INSERT

  2. Tools om in teamverband te werken met opgeslagen procedures in Oracle?

  3. SQL INSERT INTO-instructie

  4. 2 manieren om een ​​procentteken toe te voegen aan een getal in SQLite