Zoeken…


Opmerkingen

PL / pgSQL is de ingebouwde programmeertaal van PostgreSQL voor schrijffuncties die binnen de database zelf worden uitgevoerd, ook wel opgeslagen procedures in andere databases genoemd. Het breidt SQL uit met lussen, voorwaardelijke en retourtypen. Hoewel de syntaxis voor veel ontwikkelaars vreemd kan zijn, is het veel sneller dan alles dat op de toepassingsserver draait, omdat de overhead van het verbinden met de database is geëlimineerd, wat met name handig is wanneer u anders een query zou moeten uitvoeren, wacht op het resultaat, en verzend een andere vraag.

Hoewel er veel andere proceduretalen bestaan voor PostgreSQL, zoals PL / Python, PL / Perl en PLV8, is PL / pgSQL een gemeenschappelijk uitgangspunt voor ontwikkelaars die hun eerste PostgreSQL-functie willen schrijven omdat de syntaxis ervan is gebaseerd op SQL. Het is ook vergelijkbaar met PL / SQL, de oorspronkelijke proceduretaal van Oracle, dus elke ontwikkelaar die bekend is met PL / SQL zal de taal vertrouwd vinden en elke ontwikkelaar die van plan is om Oracle-applicaties in de toekomst te ontwikkelen, maar wil beginnen met een gratis database, kan overstappen van PL / pgSQL tot PL / SQL met relatief gemak.

Benadrukt moet worden dat er andere proceduretalen bestaan en dat PL / pgSQL op geen enkele manier superieur aan hen is, inclusief snelheid, maar voorbeelden in PL / pgSQL kunnen dienen als een gemeenschappelijk referentiepunt voor andere talen die worden gebruikt voor het schrijven van PostgreSQL-functies. PL / pgSQL heeft de meeste tutorials en boeken van alle PL's en kan een springplank zijn naar het leren van de talen met minder documentatie.

Hier zijn links naar enkele gratis gidsen en boeken over PL / pgSQL:

Basis PL / pgSQL-functie

Een eenvoudige PL / pgSQL-functie:

CREATE FUNCTION active_subscribers() RETURNS bigint AS $$
DECLARE
    -- variable for the following BEGIN ... END block
    subscribers integer;
BEGIN
    -- SELECT must always be used with INTO
    SELECT COUNT(user_id) INTO subscribers FROM users WHERE subscribed;
    -- function result
    RETURN subscribers;
EXCEPTION
    -- return NULL if table "users" does not exist
    WHEN undefined_table
    THEN RETURN NULL;
END;
$$ LANGUAGE plpgsql;

Dit had met alleen de SQL-instructie kunnen worden bereikt, maar toont de basisstructuur van een functie.

Ga als volgt te werk om de functie uit te voeren:

select active_subscribers();

PL / pgSQL-syntaxis

CREATE [OR REPLACE] FUNCTION functionName (someParameter 'parameterType') 
RETURNS 'DATATYPE'
AS $_block_name_$
DECLARE
    --declare something
BEGIN
    --do something
    --return something
END;
$_block_name_$
LANGUAGE plpgsql;

RETOUREN Blok

Opties voor retourneren in een PL / pgSQL-functie:

aangepaste uitzonderingen

aangepaste uitzondering 'P2222' maken:

create or replace function s164() returns void as
$$
begin
raise exception using message = 'S 164', detail = 'D 164', hint = 'H 164', errcode = 'P2222';
end;
$$ language plpgsql
;

aangepaste uitzondering maken zonder errm toe te wijzen:

create or replace function s165() returns void as
$$
begin
raise exception '%','nothing specified';
end;
$$ language plpgsql
;

roeping:

t=# do
$$
declare
 _t text;
begin
  perform s165();
  exception when SQLSTATE 'P0001' then raise info '%','state P0001 caught: '||SQLERRM;
  perform s164();

end;
$$
;
INFO:  state P0001 caught: nothing specified
ERROR:  S 164
DETAIL:  D 164
HINT:  H 164
CONTEXT:  SQL statement "SELECT s164()"
PL/pgSQL function inline_code_block line 7 at PERFORM

hier aangepaste P0001 verwerkt en P2222 niet, waardoor de uitvoering wordt afgebroken.

Het is ook heel logisch om een tabel met uitzonderingen bij te houden, zoals hier: http://stackoverflow.com/a/2700312/5315974



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow