postgresql
Programmation avec PL / pgSQL
Recherche…
Remarques
PL / pgSQL est le langage de programmation intégré de PostgreSQL pour l'écriture de fonctions qui s'exécutent dans la base de données elle-même, connue sous le nom de procédures stockées dans d'autres bases de données. Il étend SQL avec des boucles, des conditions et des types de retour. Bien que sa syntaxe puisse être étrange pour de nombreux développeurs, elle est beaucoup plus rapide que tout ce qui s'exécute sur le serveur d’application, car la surcharge de connexion à la base de données est éliminée, ce qui est particulièrement utile lorsque vous devez exécuter une requête. et soumettre une autre requête.
Bien que de nombreux autres langages procéduraux existent pour PostgreSQL, tels que PL / Python, PL / Perl et PLV8, PL / pgSQL est un point de départ commun pour les développeurs souhaitant écrire leur première fonction PostgreSQL car sa syntaxe est basée sur SQL. Il est également similaire à PL / SQL, le langage procédural natif d’Oracle, donc tout développeur familier avec PL / SQL trouvera le langage familier, et tout développeur qui a l’intention de développer des applications Oracle à l’avenir de PL / pgSQL à PL / SQL avec une relative facilité.
Il convient de souligner que d'autres langages procéduraux existent et que PL / pgSQL ne leur est pas nécessairement supérieur, y compris la vitesse, mais des exemples dans PL / pgSQL peuvent servir de point de référence commun pour d'autres langages utilisés pour écrire des fonctions PostgreSQL. PL / pgSQL a le plus de tutoriels et de livres de tous les PL et peut être un tremplin pour apprendre les langues avec moins de documentation.
Voici des liens vers des guides et des livres gratuits sur PL / pgSQL:
- La documentation officielle: https://www.postgresql.org/docs/current/static/plpgsql.html
- Tutoriel w3resource.com: http://www.w3resource.com/PostgreSQL/pl-pgsql-tutorial.php
- tutoriel postgres.cz: http://postgres.cz/wiki/PL/pgSQL_(en)
- PostgreSQL Server Programming, 2e édition: https://www.packtpub.com/big-data-and-business-intelligence/postgresql-server-programming-second-edition
- Guide du développeur PostgreSQL: https://www.packtpub.com/big-data-and-business-intelligence/postgresql-developers-guide
Fonction de base PL / pgSQL
Une simple fonction PL / pgSQL:
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;
Cela aurait pu être réalisé avec juste l'instruction SQL mais montre la structure de base d'une fonction.
Pour exécuter la fonction, faites:
select active_subscribers();
Syntaxe PL / pgSQL
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;
RETOURS Bloc
Options pour retourner dans une fonction PL / pgSQL:
-
Datatype
Liste de tous les types de données -
Table(column_name column_type, ...)
-
Setof 'Datatype' or 'table_column'
exceptions personnalisées
créer une exception personnalisée 'P2222':
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
;
créer une exception personnalisée n'attribuant pas d'erreur:
create or replace function s165() returns void as
$$
begin
raise exception '%','nothing specified';
end;
$$ language plpgsql
;
appel:
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
ici personnalisé P0001 traité, et P2222, non, abandonnant l'exécution.
Il est également très logique de conserver un tableau des exceptions, comme ici: http://stackoverflow.com/a/2700312/5315974