CREATE OR REPLACE FUNCTION explose_date_table (d date)RETURNSTABLE (jour integer, mois integer, annee integer)LANGUAGEsqlAS$$SELECTextract (dayFROM d)::int,extract(monthFROM d)::int,extract (yearFROM d)::int ;$$ ;
SELECT*FROM explose_date ('31-12-2020');
jour | mois | annee------+------+------- 31 | 0 | 2020
Fonction SQL
renvoyant plusieurs lignes d’une table
CREATE OR REPLACE FUNCTION tables_jamais_analyzees ()RETURNSSETOF pg_stat_user_tablesLANGUAGEsqlAS$$SELECT*FROM pg_stat_user_tablesWHEREcoalesce(last_analyze, last_autoanalyze) ISNULL ;$$ ;
Exemples de routines PL/pgSQL
Exemple
de procédure PL/pgSQL avec gestion transactionnelle
CREATEOR REPLACE PROCEDURE vide_tables (dry_run BOOLEAN) AS$$BEGIN TRUNCATE TABLE pgbench_history ; TRUNCATE TABLE pgbench_accounts CASCADE ; TRUNCATE TABLE pgbench_tellers CASCADE ; TRUNCATE TABLE pgbench_branches CASCADE ; IF dry_run THEN ROLLBACK ; END IF ;EXCEPTION WHEN undefined_table THEN RAISE NOTICE 'Table inexistante [%] %', SQLSTATE, SQLERRM; ROLLBACK ;END ; $$LANGUAGE plpgsql ;
CALL vide_tables (dry_run=>true);
Exemple
de bloc anonyme avec variable, boucle sur une table, et SQL
dynamique
DO $$DECLARE r record ; n int:=0 ;BEGINFOR r IN (SELECT schemaname, relnameFROM pg_stat_user_tablesWHEREcoalesce(last_analyze, last_autoanalyze) ISNULL ) LOOP n := n+1 ; RAISE NOTICE '% - Analyze de : %.%', n, r.schemaname, r.relname ;EXECUTE'ANALYZE '||quote_ident(r.schemaname)||'.'||quote_ident(r.relname) ;ENDLOOP;END$$ ;
Exemple de trigger
CREATE OR REPLACE FUNCTION horodatage() RETURNStriggerAS$$BEGINIF TG_OP ='INSERT'THENNEW.date_ajout :=now(); ELSEIF TG_OP ='UPDATE'THENNEW.date_modif :=now();ENDIF;RETURNNEW;END; $$LANGUAGE plpgsql;CREATETRIGGER trig_horodatageBEFOREINSERTORUPDATEON ma_tableFOREACHROWEXECUTEPROCEDURE horodatage();