Vous n'êtes pas identifié(e).

#1 27/04/2015 09:53:21

mortimer.pw
Membre

Déclarer liste

Bonjour,

Je travaille sous CenOS 5.9 avec un moteur PostgreSQL 9.3.2.

Je souhaite écrire une Fonction qui, avec une liste de tables définie dans la partie DECLARE, exécute par exemple un SELECT COUNT(*) FROM "table de la liste" et insère le résultat dans une table.

Est-t-il possible de définir des listes, ou des tableaux, ou autres, dans la partie DECLARE ?

D'avance merci pour les réponses.

Hors ligne

#2 27/04/2015 20:58:10

gleu
Administrateur

Re : Déclarer liste

Des tableaux, oui. Pas des listes.


Guillaume.

Hors ligne

#3 28/04/2015 09:25:53

mortimer.pw
Membre

Re : Déclarer liste

Bonjour Guillaume,
Oui, merci. J'ai finalement trouvé.
Pour ceux que cela intéresse :
CREATE OR REPLACE FUNCTION infos_tables() RETURNS void AS
$BODY$
DECLARE
    cSchema VARCHAR;
    cTable VARCHAR;
    tTabSchema VARCHAR[]:=ARRAY['toto','tata','titi'];
    tTabToto VARCHAR[]:=ARRAY['table1','table2','table3'];
    tTabTata VARCHAR[]:=ARRAY['table1','table2','table3','table4','table5'];
    tTabTiti VARCHAR[]:=ARRAY['table1','table2','table3','table4'];
    nNbEnr INTEGER;
    nSize BIGINT;
BEGIN
    DELETE FROM infos_table_snap WHERE EXTRACT(DAYS FROM CURRENT_TIMESTAMP-now)::INTEGER>60;
    FOREACH cSchema IN ARRAY tTabSchema LOOP
        FOREACH cTable IN ARRAY CASE WHEN cSchema='toto' THEN tTabToto ELSE CASE WHEN cSchema='tata' THEN tTabTata ELSE CASE WHEN cSchema='titi' THEN tTabTiti END END END LOOP
            EXECUTE 'SELECT COUNT(*) FROM '||cSchema||'.'||cTable INTO nNbEnr;
            EXECUTE 'SELECT PG_TABLE_SIZE('||CHR(39)||cSchema||'.'||cTable||CHR(39)||')/1024/1024' INTO nSize;
            EXECUTE 'INSERT INTO infos_table_snap(now,schema_name,table_name,nb_enr,size) VALUES('||'CURRENT_TIMESTAMP'||','||CHR(39)||cSchema||CHR(39)||','||CHR(39)||cTable||CHR(39)||','||nNbEnr||','||nSize||')';
            RAISE NOTICE 'Extraction infos Table : %.%',cSchema,cTable;
        END LOOP;
    END LOOP;
END;
$BODY$
LANGUAGE plpgsql VOLATILE COST 100;

Hors ligne

Pied de page des forums