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.