sql >> Databasteknik >  >> RDS >> PostgreSQL

En översikt över de nya lagrade procedurerna i PostgreSQL 11

Som du kanske vet i alla versioner upp till PostgreSQL 10 var det inte möjligt att skapa en procedur i PostgreSQL. I PostgreSQL 11 lades PROCEDURE till som ett nytt schemaobjekt som är ett objekt som liknar FUNCTION, men utan ett returvärde.

Under årens lopp var många angelägna om att få funktionen och den lades till slut till i PostgreSQL 11. Traditionellt har PostgreSQL tillhandahållit alla medel för att skriva funktioner (som kallades som lagrade procedurer), men i en funktion kan du inte köra transaktioner. Allt du egentligen kan använda är undantag, som i princip är räddningspunkter. Inuti en funktionskropp kan du inte bara utföra en transaktion eller öppna en ny. Den nya SKAPA PROCEDUREN kommer att ändra allt detta och tillhandahålla en funktionalitet för att köra transaktioner i procedurkod.

Fördelar med att använda lagrade procedurer

  • Transaktionskontroll som gör det möjligt för oss att KOMMITTERA och ROLLBACK inuti procedurer.
  • Mycket användbar för Oracle till PostgreSQL-migrering, den nya procedurfunktionaliteten kan vara en betydande tidsbesparing.
  • Som du kan se finns det ett par likheter mellan CREATE FUNCTION och CREATE PROCEDUR så det borde vara väldigt enkelt för de flesta slutanvändare.

Hur man använder lagrad procedur i PostgreSQL

Använd CREATE PROCEDURE för att skapa en ny procedur i PostgreSQL 11, den låter dig skriva procedur precis som andra databaser. PROCEDUR är nästan samma som FUNCTION utan ett returvärde. PROCEDURE skapas med CREATE PROCEDURE-satsen i PostgreSQL 11. Till skillnad från CREATE FUNCTION-satsen finns det ingen RETURNS-sats, ROWS-sats etc.

Syntax

postgres=# \h CREATE PROCEDURE
Command:     CREATE PROCEDURE
Description: define a new procedure
Syntax:
CREATE [ OR REPLACE ] PROCEDURE
    name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ] )
  { LANGUAGE lang_name
    | TRANSFORM { FOR TYPE type_name } [, ... ]
    | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
    | SET configuration_parameter { TO value | = value | FROM CURRENT }
    | AS 'definition'
    | AS 'obj_file', 'link_symbol'
  } ...

Exempel

CREATE PROCEDURE procedure1(INOUT p1 TEXT) 
AS $$
BEGIN
    RAISE NOTICE 'Procedure Parameter: %', p1 ;
END ;
$$
LANGUAGE plpgsql ;

Kör PROCEDUR i PostgreSQL

För att köra PROCEDURE i PostgreSQL, använd CALL-satsen istället för SELECT-satsen. Detta är en av skillnaderna mellan PROCEDUR och FUNKTION.

postgres=# CALL procedure1 (' CREATE PROCEDURE functionality supported in PostgreSQL 11! ');    
NOTICE:  Procedure Parameter:  CREATE PROCEDURE functionality supported in PostgreSQL 11!       
                              p1                                                                
--------------------------------------------------------------                                  
  CREATE PROCEDURE functionality supported in PostgreSQL 11!                                    
(1 row)

Du kan också ange parameternamn i CALL-satsen. Detta är ett annat sätt att utföra PROCEDUREN.

postgres=# CALL procedure1 (p1=>'CREATE PROCEDURE functionality supported in PostgreSQL 11!');
NOTICE:  Procedure Parameter: CREATE PROCEDURE functionality supported in PostgreSQL 11!        
                             p1                                                                 
------------------------------------------------------------                                    
 CREATE PROCEDURE functionality supported in PostgreSQL 11!                                     
(1 row)

Visa lista över skapad PROCEDUR

Du kan kontrollera definitionen av skapad PROCEDUR från kommandot psql, dvs '\df'. Psql-kommandot '\df' används också för att visa definitionen av skapad FUNKTION.

PROCEDUREN visar kolumnen Typ som "proc" och om det är FUNCTION ändras kolumnen Typ till "func".

I listan nedan med funktioner har vi skapat en PROCEDUR så att kolumnen Typ ändrades till "proc".

postgres=# \df
                          List of functions
Schema |    Name    | Result data type | Argument data types | Type
--------+------------+------------------+---------------------+------
public | procedure1 |                  | INOUT p1 text       | proc
(1 row)

Här kan vi skapa en FUNKTION för att kontrollera kolumnen Typ.

CREATE FUNCTION function1(INOUT p1 TEXT) 
AS $$
BEGIN
    RAISE NOTICE 'Function Parameter: %', p1 ;
END ;
$$
LANGUAGE plpgsql ;

Utför FUNCTION med SELECT-kommandot.

postgres=# SELECT function1('CREATE PROCEDURE functionality supported in PostgreSQL 11!');     
NOTICE:  Function Parameter: CREATE PROCEDURE functionality supported in PostgreSQL 11!        
                         function1                                                             
------------------------------------------------------------                                   
 CREATE PROCEDURE functionality supported in PostgreSQL 11!                                    
(1 row)

Nu kan du kontrollera kolumnen Typ och se skillnaden. För FUNCTION funktion1 ändrades kolumnen Typ till "func". Du kan se ytterligare en skillnad här, PROCEDUR är nästan samma som FUNCTION utan ett returvärde.

postgres=# \df  
                          List of functions                                                                                                                      
 Schema |    Name    | Result data type | Argument data types | Type          
--------+------------+------------------+---------------------+------         
 public | function1  | text             | INOUT p1 text       | func          
 public | procedure1 |                  | INOUT p1 text       | proc          
(2 rows)

Visa definition av PROCEDUR i PostgreSQL

Använd '\sf' för att visa definitionen av skapad PROCEDUR.

postgres=# \sf procedure1                                                    
CREATE OR REPLACE PROCEDURE public.procedure1(INOUT p1 text)                 
 LANGUAGE plpgsql                                                            
AS $procedure$                                                               
BEGIN                                                                        
 RAISE NOTICE 'Procedure Parameter: %', p1 ;                                 
END ;                                                                        
$procedure$
Ladda ner Whitepaper Today PostgreSQL Management &Automation med ClusterControlLäs om vad du behöver veta för att distribuera, övervaka, hantera och skala PostgreSQLDladda Whitepaper

Transaktionskontroll i PROCEDUR

Transaktionskontroll som gör det möjligt för oss att ÅTGÄRDERA och ROLLBACK inuti procedurer. CREATE FUNCTION stöder inte transaktioner inuti funktionen. Detta är huvudskillnaden mellan FUNCTION och PROCEDURE i PostgreSQL.

Låt oss skapa en enkel lagrad procedur som hanterar transaktioner.

CREATE OR REPLACE PROCEDURE transaction_test() 
LANGUAGE plpgsql 
AS $$
DECLARE
BEGIN
  CREATE TABLE committed_table (id int);
  INSERT INTO committed_table VALUES (1);
  COMMIT;
  CREATE TABLE rollback_table (id int);
  INSERT INTO rollback_table VALUES (1);
  ROLLBACK;
END $$;

Utför PROCEDUREN med CALL-satsen.

postgres=# CALL transaction_test();                                                      
CALL 

Kontrollera exekveringsresultatet.

postgres=# \d                                                                         
              List of relations                                                       
 Schema |      Name       | Type  |  Owner                                            
--------+-----------------+-------+----------                                         
 public | committed_table | table | postgres                                          
(1 row)                                                                               

postgres=# SELECT * FROM committed_table;
id
----
  1
(1 row)

I den här bloggen har vi sett transaktionskontroll för SKAPA PROCEDUR med PL/pgSQL-språk men transaktionskontroll tillhandahålls även på andra språk som PL/Python, PL/Tcl, PL/Perl.

Syntaxen för transaktionskontroll på andra språk är följande:

  • PL/Python
    • plpy.commit()
    • plpy.rollback()
  • PL/Tcl
    • Bekräfta
    • återställ
  • PL/Perl
    • spi_commit()
    • spi_rollback()

Slutsats

SKAPA PROCEDUR är definitivt en av de viktiga och önskvärda funktionerna i PostgreSQL 11. Den här funktionen är mycket användbar för Oracle till PostgreSQL-migrering och många olika användningsfall och många människor välkomnar den säkert.


  1. Oracle.DataAccess.Client.OracleException ORA-03135:anslutning förlorad kontakt

  2. JSON_VALUE() Exempel i SQL Server (T-SQL)

  3. Hur definierar man en trigger ON COMMIT i Oracle?

  4. RENSA SKÄRM - Genväg för Oracle SQL-utvecklare?