sql >> Database teknologi >  >> RDS >> PostgreSQL

En oversigt over de nye lagrede procedurer i PostgreSQL 11

Som du måske ved i alle versionerne op til PostgreSQL 10, var det ikke muligt at oprette en procedure i PostgreSQL. I PostgreSQL 11 blev PROCEDURE tilføjet som et nyt skemaobjekt, som er et objekt, der ligner FUNCTION, men uden en returværdi.

Gennem årene var mange mennesker ivrige efter at få funktionaliteten, og den blev endelig tilføjet i PostgreSQL 11. Traditionelt har PostgreSQL givet alle midlerne til at skrive funktioner (som blev kaldt som lagrede procedurer), men i en funktion kan du ikke køre transaktioner. Det eneste du virkelig kan bruge er undtagelser, som dybest set er savepoints. Inde i et funktionslegeme kan du ikke bare foretage en transaktion eller åbne en ny. Den nye CREATE PROCEDURE vil ændre alt dette og give en funktionalitet til at køre transaktioner i procedurekoden.

Fordele ved at bruge lagrede procedurer

  • Transaktionskontrol, der giver os mulighed for at COMMIT og TILBAGE i procedurer.
  • Meget nyttig for Oracle til PostgreSQL-migrering, den nye procedurefunktionalitet kan være en betydelig tidsbesparelse.
  • Som du kan se, er der et par ligheder mellem CREATE FUNCTION og CREATE PROCEDURE, så tingene burde være virkelig nemme for de fleste slutbrugere.

Sådan bruges Stored Procedure i PostgreSQL

Brug CREATE PROCEDURE til at oprette en ny procedure i PostgreSQL 11, den vil tillade dig at skrive procedure ligesom andre databaser. PROCEDURE er næsten det samme som FUNCTION uden en returværdi. PROCEDURE oprettes med CREATE PROCEDURE-sætningen i PostgreSQL 11. I modsætning til CREATE FUNCTION-sætningen er der ingen RETURNS-sætning, ROWS-sætning osv.

Syntaks

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'
  } ...

Eksempel

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

Udfør PROCEDURE i PostgreSQL

For at udføre PROCEDURE i PostgreSQL skal du bruge CALL-sætningen i stedet for SELECT-sætningen. Dette er en af ​​forskellene mellem PROCEDURE og 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 også angive parameternavn i CALL-sætningen. Dette er en anden måde at udføre PROCEDUREN på.

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)

Vis liste over oprettet PROCEDURE

Du kan kontrollere definitionen af ​​oprettet PROCEDURE fra psql-kommandoen, dvs. '\df'. Psql-kommandoen '\df' bruges også til at vise definitionen af ​​oprettet FUNKTION.

PROCEDUREN viser Type-kolonnen som "proc", og hvis den er FUNCTION, ændres Type-kolonnen til "func".

På nedenstående liste over funktioner har vi oprettet én PROCEDURE, så kolonnen Type ændres til "proc".

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

Her kan vi oprette én FUNKTION for at kontrollere kolonnen Type.

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

Udfør FUNCTION ved hjælp af SELECT-kommandoen.

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 tjekke kolonnen Type og se forskellen. For FUNCTION-funktionen 1 blev kolonnen Type ændret til "func". Du kan se en forskel mere her, PROCEDURE er næsten det samme som FUNCTION uden en returværdi.

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)

Vis PROCEDURE Definition i PostgreSQL

Brug '\sf' for at vise definitionen af ​​oprettet PROCEDURE.

postgres=# \sf procedure1                                                    
CREATE OR REPLACE PROCEDURE public.procedure1(INOUT p1 text)                 
 LANGUAGE plpgsql                                                            
AS $procedure$                                                               
BEGIN                                                                        
 RAISE NOTICE 'Procedure Parameter: %', p1 ;                                 
END ;                                                                        
$procedure$
Download Whitepaper Today PostgreSQL Management &Automation med ClusterControlFå flere oplysninger om, hvad du skal vide for at implementere, overvåge, administrere og skalere PostgreSQLDownload Whitepaper

Transaktionskontrol i PROCEDURE

Transaktionskontrol, der giver os mulighed for at COMMIT og ROLLBACK inde i procedurer. CREATE FUNCTION understøtter ikke transaktion inde i funktionen. Dette er hovedforskellen mellem FUNCTION og PROCEDURE i PostgreSQL.

Lad os skabe en simpel lagret procedure, der håndterer 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 $$;

Udfør PROCEDUREN med CALL-sætning.

postgres=# CALL transaction_test();                                                      
CALL 

Tjek udførelsesresultatet.

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 denne blog har vi set transaktionskontrol til CREATE PROCEDURE ved hjælp af PL/pgSQL-sprog, men transaktionskontrol findes også på andre sprog som PL/Python, PL/Tcl, PL/Perl.

Syntaksen for transaktionskontrol på andre sprog er som følger:

  • PL/Python
    • plpy.commit()
    • plpy.rollback()
  • PL/Tcl
    • Forpligt
    • tilbagestilling
  • PL/Perl
    • spi_commit()
    • spi_rollback()

Konklusion

CREATE PROCEDURE er absolut en af ​​de vigtige og ønskværdige funktioner i PostgreSQL 11. Denne funktion er meget nyttig for Oracle til PostgreSQL-migrering og mange forskellige use cases, og mange mennesker hilser den helt sikkert velkommen.


  1. MYSQL importerer data fra csv ved hjælp af LOAD DATA INFILE

  2. Fejl:Intet modul med navnet psycopg2.extensions

  3. Send og returner tilpasset array-objekt i ibatis og oracle i java

  4. Tilføjelse af en ny værdi til en eksisterende ENUM-type