Vous n'êtes pas identifié(e).
Bonjour @ tous.
Je viens de réaliser une requête suffisamment simple pour me donner le résultat escompté au seul problème que je n'ai pas les résultats agrégés sur une seule ligne, je m'explique.
Je tente d'avoir pour une commune de départ, une commune d'arrivée, le nombre d'homme et le nombre de femmes (en tout 4 colonnes + identifiant unique). Je fais donc ma requête :
SELECT DISTINCT row_number() OVER () AS id_unique, commune_depart AS depart, commune_arrivee AS arrivee,
CASE
WHEN sexe = 1 THEN sum(nb)
END AS homme,
CASE
WHEN sexe = 2 THEN sum(nb)
END AS femme
FROM flux
GROUP BY commune_depart, commune_arrivee,sexe
Mais en résultat j'ai :
id_unique depart arrivee homme femme
1 Alfrome Alfrime 16
2 Alfrome Alfrime 32
Bien sur, ce que je voudrais, et vous l'aurez deviné c'est :
id_unique depart arrivee homme femme
1 Alfrome Alfrime 16 32
Est-ce que vous auriez une idée d'utilisation du GROUP BY avec un CASE ?
Par avance merci de votre aide.
Geo-x
Bonjour Sadewizz.
Il y a tout d'abord un ensemble de traitement à faire au niveau de votre fonction. Actuellement vous ne lancez aucune fonction lors de l'insertion dans la vue "table_liste_emprise" mais dans la table zone_geographique
INSTEAD OF INSERT ON zone_geographique
Ensuite il y a dans votre code tout un tas de mélange, exemple, un trigger return soit NEW soit NULL mais pas les deux :
RETURN NEW;
return null;
L'INSERT INTO ne s'écrit pas exactement comme vous avez pu le syntaxé : http://postgresql.developpez.com/docume … nsert.html
Pour ce qui est de l'activation d'un trigger à l'insertion dans une vue ça ne me semble pas possible. Je vous conseil de créer une règle à l'insertion sur votre vue qui lancera une fonction qui elle va insérer les valeurs voulues dans votre table.
Geo-x
Re bonjour @ tous.
Je viens de trouver une fonction qui me permet de créer un identifiant unique dans une sélection : row_number() over()
Pour mon exemple :
SELECT row_number() OVER(ORDER BY foo.e) AS "identifiant",foo.e FROM (SELECT 'mammouth'::varchar AS "e"
UNION
SELECT 'ortie'::varchar AS "e"
UNION
SELECT 'Pingouin'::varchar AS "e")foo;
Et le tour est joué !
En espérant que ça puisse aider d'autres personnes.
@très vite.
Geo-x
Bonjour à tous.
Je souhaite effectuer une requête qui d'un côté me permette de sélectionner un certain nombre d'objet. Exemple :
mammouth
ortie
Pingouin
Et d'un autre faire un generate_series prenant en compte le nombre de résultat de ma requête précédente (ici 3), pour ensuite avoir un résultat du type :
1 mammouth
2 ortie
3 Pingouin
Ce que je fais actuellement, c'est que je fait :
SELECT generate_series(1,3,1) AS "identifiant",foo.e FROM (SELECT 'mammouth'::varchar AS "e"
UNION
SELECT 'ortie'::varchar AS "e"
UNION
SELECT 'Pingouin'::varchar AS "e")foo
Mais en résultat j'ai ;
1 mammouth
1 ortie
1 Pingouin
2 mammouth
2 ortie
2 Pingouin
3 mammouth
3 ortie
3 Pingouin
Pourriez-vous m'aider à toruver une solution svp ?
Par avance merci.
Geo-x
Bonjour tatou.
Essayez plutôt : select (465551/1000) ::numeric(7,3);
Sinon c'est 1000 que vous mettez en numeric(7,3).
Geo-x
CQFD
C'est diaboliquement efficace, j'aime les choses compliquées qui semblent si simple !
Un grand merci arthurr, ça va au-delà de mes espérances avec la récupération des identifiants.
Je ne vais pas oser parler de ce vers quoi j'étais partie, c'est à dire, une usine à gaz...
Geo-x
Oui c'est exactement ça, mais j'ai mis deux car il y a bien deux périodes de réservation qui se chevauchent. Mais en effet, l'important est de savoir si oui ou non il y a d'autre date qui se chevauche et si oui combien.
Et mince...je suis en postgres 9.1 ...
Mouais je me demandais si j'étais très clair, j'ai la réponse ;-)
Mais rjuju m'a donné une bonne piste avec ces intervalles que je ne connaissais pas, je vais jeter un coup d'oeil !
Grossomodo, la question est, pour chaque période donné (donc pour chaque ligne), combien de période se chevauchent...
Mouais, pas sûr d'être très clair non plus...
Bonjour à tous.
Dans une catégorie à peu près similaire, j'essaie de connaitre les dates communes entre plusieurs périodes, je m'explique.
J'ai 3 colonnes :
date_debut | date_fin
-----------------------------
2014-02-21 | 2014-02-25
2014-02-20 | 2014-02-22
2014-02-26 | 2014-02-27
Je souhaiterais savoir combien il y a de lignes pour des périodes communes, ce qui me donnerait au final
date_debut | date_fin | nombre_periode
--------------------------------------------------
2014-02-21 | 2014-02-25 | 2
2014-02-20 | 2014-02-23 | 2
2014-02-26 | 2014-02-27 | 1
Période commune les 21/04/2014, 22/04/2014 et 23/04/2014
C'est possible ce genre de chose? je n'ai rien trouvé qui aille dans ce sens...
Geo-x
Bonjour rjuju.
En fait, c'est la configuration de notre logiciel qui impose ce genre de contrainte par rapport au type de champ.
Sinon la requête est parfaite et très intéressante d'un point de vue technique !
Ceci m'emmène à une autre question, quand vous faites "group by 1" ça veut dire qu'il y a un GROUP BY sur le premier champ appellé dans le SELECT ?
Bonjour @ tous.
Je sais que je vous sollicite beaucoup en ce moment, mais si vous étiez moins bon dans vos réponses il est fort probable que je vous demande moins de choses ;-)
Aujourd'hui, j'essaie une fois de plus d'innover en voulant réaliser un relace avec des valerurs sources et destination issues d'une autre table, je m'explique :
1- J'ai une table1 qui contient une liste d'id associée à un nom
id | nom
-----------------
1 | coucou
2 | chouette
3 | hibou
2- J'ai une table2 qui contient un champ varchar[] qui contient le résultat de cette table 1
id | champ1
----------------
10 | {3,2}
20 | {3,1,2}
3- Ce que je souhaite faire, c'est faire apparaitre avec ma requête les vrais valeurs (issues de la table1) associées au numéro de la table2 :
id | resultat
-------------------------------
10 | hibou,chouette
20 | hibou,coucou,chouette
Pour ça, j'ai déjà testé sur un numéro en particulier :
select replace(replace(replace(array(SELECT unnest(champ1) from table2 where id=10)::varchar,'{',''),'}',''),foo.id,foo.nom) FROM (SELECT id::varchar,nom FROM table1)foo;
Le problème c'est que le résultat apparait sous la forme suivante :
id | resultat
-------------------------------
10 | "hibou,2"
10 | "1,chouette"
Est-ce que vous avez une solution pour ce genre de problèmatique ?
Par avance merci de votre aide.
Geo-x
Merci rjuju, ça c'est ce que j 'appel de la réactivité !!
Voici le code final de la fonction qui permet, pour rappel, de générer un tableau HTML à partir de 5 champ et 1 table en entrée :
CREATE OR REPLACE FUNCTION sortie_tableau_html5(c1 varchar,c2 varchar,c3 varchar,c4 varchar,c5 varchar,var_table varchar)
RETURNS varchar AS
$BODY$
DECLARE
var_tableau_html varchar;
var_text text;
BEGIN
BEGIN
var_tableau_html='<TABLE BORDER="0"><TR align="center">><TH>'||c1||'</TH> ';
var_tableau_html=var_tableau_html||'<TH>'||c2||'</TH> ';
var_tableau_html=var_tableau_html||'<TH>'||c3||'</TH> ';
var_tableau_html=var_tableau_html||'<TH>'||c4||'</TH> ';
var_tableau_html=var_tableau_html||'<TH>'||c5||'</TH></TR>';
raise notice 'var_tableau_html : %', var_tableau_html;
FOR v_text IN EXECUTE 'SELECT DISTINCT ''<TR align="center"><td>''||'||c1||'||''</td><td>''||'||c2||'||''</td><td>''||'||c3||'||''</td><td>''||'||c4||'||''</td><td>''||'||c5||'||''</td></TR>'' FROM '||var_table
LOOP
var_tableau_html=var_tableau_html||v_text;
raise notice 'var_tableau_html : %', var_tableau_html;
END LOOP;
var_tableau_html=var_tableau_html||'</TABLE>';
return var_tableau_html;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
Question subsidiaire, est-il possible de compter le nombre de colonnes issues d'une requête, par exemple, d'un SELECT * ?
A très vite.
Geo-x
Bonjour @ tous.
J'essaie de créer une fonction qui me permettra de renvoyer un tableau au format HTML (sans passer par du PHP).
Je demande donc en entrée 5 champs (parce que c'est ce dont j'ai besoin) et 1 table
CREATE OR REPLACE FUNCTION sortie_tableau_html5(c1 varchar,c2 varchar,c3 varchar,c4 varchar,c5 varchar,var_table varchar)
Ensuite je déclare une variable qui contiendra le code HTML
DECLARE var_tableau_html varchar;
Et un record qui me servira plus tard
DECLARE var_titre_tableau record;
Ensuite, je commence à structurer mon tableau en indiquant les titres des colonnes
var_tableau_html='<TABLE BORDER="0"><TR><TH>'||c1||'</TH> ';
var_tableau_html=var_tableau_html||'<TH>'||c2||'</TH> ';
var_tableau_html=var_tableau_html||'<TH>'||c3||'</TH> ';
var_tableau_html=var_tableau_html||'<TH>'||c4||'</TH> ';
var_tableau_html=var_tableau_html||'<TH>'||c5||'</TH></TR><TR>';
Mais après ça se complique...Quand je veux faire une boucle sur le résultat de ma requête qui remplira le tableau. Je fais une boucle
FOR var_titre_tableau IN EXECUTE 'SELECT DISTINCT '||c1||','||c2||','||c3||','||c4||','||c5||' FROM '||var_table
LOOP
var_tableau_html=var_tableau_html||'<TD>'||var_titre_tableau.c1||'</TD>';
var_tableau_html=var_tableau_html||'<TD>'||var_titre_tableau.c2||'</TD>';
var_tableau_html=var_tableau_html||'<TD>'||var_titre_tableau.c3||'</TD>';
var_tableau_html=var_tableau_html||'<TD>'||var_titre_tableau.c4||'</TD>';
var_tableau_html=var_tableau_html||'<TD>'||var_titre_tableau.c5||'</TD>';
END LOOP;
Puis je ferme mon tableau que je renvoie
var_tableau_html=var_tableau_html||'</TR></TABLE>';
return var_tableau_html;
Le problème, c'est que la boucle ne fonctionne pas, je n'arrive pas à faire interpréter à ma fonction une grille de lecture sur le résultat de ma requête
ERROR: record "var_titre_tableau" has no field "c2"
J'ai essayé différents stratagèmes :
1- Créer ma requête en amont et exécuter après le IN
2- Créer plutôt dans ma boucle une requête du type
EXECUTE var_tableau_html=var_tableau_html||'<TD>'||var_titre_tableau.c1||'</TD>';
Mais rien n'y fait, ça ne fonctionne pas...
Z'auriez une explication par hasard ? ;-)
Geo-x
Bonjour Gleu.
En effet merci pour ces précisions. J'en ai profité pour mettre également en place un petit compteur avec le pourcentage d'avancement sous forme de RAISE NOTICE.
CREATE OR REPLACE FUNCTION research_txt(txtsearch text)
RETURNS SETOF text AS
$BODY$
DECLARE
var_liste_table_colonne record;
var_requete text;
var_pourcentage numeric(10,2);
var_nb_ligne numeric(10,2);
var_compteur numeric(10,2)=0.00;
BEGIN
SELECT count(quote_ident(c.relname)||quote_ident(a.attname)) INTO var_nb_ligne
FROM pg_namespace n
LEFT JOIN pg_class c ON c.relnamespace = n.oid
LEFT JOIN pg_attribute a ON a.attrelid = c.oid
WHERE a.attnum > 0 AND quote_ident(n.nspname)='public' AND c.relam=0 AND relkind<>'S' AND relkind<>'c' AND quote_ident(c.relname)<>'spatial_ref_sys' AND quote_ident(c.relname)<>'geography_columns' AND quote_ident(c.relname)<>'geometry_columns'
AND quote_ident(c.relname)<>'raster_columns' AND quote_ident(c.relname)<>'raster_overviews' AND quote_ident(a.attname)<>'ogc_fid' AND quote_ident(a.attname)<>'wkb_geometry';
FOR var_liste_table_colonne IN
SELECT quote_ident(c.relname) AS table,quote_ident(a.attname) AS colonne
FROM pg_namespace n
LEFT JOIN pg_class c ON c.relnamespace = n.oid
LEFT JOIN pg_attribute a ON a.attrelid = c.oid
WHERE a.attnum > 0 AND quote_ident(n.nspname)='public' AND c.relam=0 AND relkind<>'S' AND relkind<>'c' AND quote_ident(c.relname)<>'spatial_ref_sys' AND quote_ident(c.relname)<>'geography_columns' AND quote_ident(c.relname)<>'geometry_columns'
AND quote_ident(c.relname)<>'raster_columns' AND quote_ident(c.relname)<>'raster_overviews' AND quote_ident(a.attname)<>'ogc_fid' AND quote_ident(a.attname)<>'wkb_geometry'
ORDER BY quote_ident(c.relname),quote_ident(a.attname)
LOOP
-- Calcul du pourcentage d'avancement de la requêtes
var_compteur=var_compteur+1;
var_pourcentage=(var_compteur*100)/var_nb_ligne;
-- Sélection de toutes les lignes contenant le caracère définit
var_requete= 'SELECT DISTINCT '''||replace(quote_ident(var_liste_table_colonne.table)||' - '||quote_ident(var_liste_table_colonne.colonne),'"','')||'''::text FROM '||quote_ident(replace(var_liste_table_colonne.table,'"',''))
||' WHERE '||var_liste_table_colonne.colonne||'::text like '''||txtsearch||'%'' OR '||var_liste_table_colonne.colonne||'::text LIKE ''%'||txtsearch||'%'' OR '
||var_liste_table_colonne.colonne||'::text LIKE ''%'||txtsearch||''';';
raise notice 'Pourcentage : %', var_pourcentage||' %';
raise notice 'Requête : %', var_requete;
RETURN QUERY
EXECUTE var_requete;
END LOOP;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
ROWS 1000;
ALTER FUNCTION research_txt(text)
OWNER TO postgres;
Je viens de finir de mettrre au poin ma reuqête qui permet d'effectuer une recherche de texte dans une base de donnée et vue que j'ai trouvé de l'aide ici, il me parait normal de vous fournir cette fonction :
CREATE OR REPLACE FUNCTION research_txt(txtsearch text)
RETURNS SETOF text AS
$BODY$
DECLARE
var_liste_table_colonne record;
requete text;
BEGIN
FOR var_liste_table_colonne IN
SELECT quote_ident(c.relname) AS table,quote_ident(a.attname) AS colonne
FROM pg_namespace n
LEFT JOIN pg_class c ON c.relnamespace = n.oid
LEFT JOIN pg_attribute a ON a.attrelid = c.oid
WHERE a.attnum > 0 AND quote_ident(n.nspname)='public'
ORDER BY quote_ident(c.relname),quote_ident(a.attname)
LOOP
requete= 'SELECT DISTINCT '''||replace(quote_ident(var_liste_table_colonne.table||' - '||quote_ident(var_liste_table_colonne.colonne)),'"','')||'''::text FROM '||quote_ident(replace(var_liste_table_colonne.table,'"',''))||' WHERE '||quote_ident(var_liste_table_colonne.colonne)||'::text like '''||txtsearch||'%'' OR '||quote_ident(var_liste_table_colonne.colonne)||'::text LIKE ''%'||txtsearch||'%'' OR '
||quote_ident(var_liste_table_colonne.colonne)||'::text LIKE ''%'||txtsearch||''';';
raise notice 'requête : %', requete;
RETURN QUERY
EXECUTE requete;
END LOOP;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION research_txt(text)
OWNER TO postgres;
N'hésitez pas si vous voyez un moyen d'optimiser la chose, je suis preneur ;-)
Bonne journée.
Geo-x
:-D Désolé mais en me relisant, je vois que deux lectures sont possibles, je vais donc schématisé pour être plus précis ;-)
En fait j'ai une table TABLE1 avec des colonnes COL1,COL2 qui ocntiennent des données COL1.'értech', COL1.'rtech' / COL2.'ameil', COL2.'Proyard'
Ce que je souhaite faire c'est recenser le nom de latable et de la colonne (ce que fais très bien votre fonction) qui ont des données qui contiennent certains caractères.
Dans cet exemple si je cherche 'é' il me faut en résultat TABLE1 .COL1
Merci de votre aide.
Geo-x
Bonjour Julien et merci de votre réponse.
Cependant, même si votre fonction permet d'optimiser un certain nombre de procsessus, elle ne répond pas exactement à ce que je souhaite faire.
En effet, si je crée une boucle c'est pour pouvoir rechercher une chaîne de caractère spécifique dans chaque colonne de chaque table de ma base de données.
Geo-x
Bonjour @ tous.
Voilà, j'essaie de créer une fonction qui me permettra de chercher un caractère spécifique dans toutes les tables d'une base de données dans laquelle l'utilisateur lance sa fonction.
Pour ce faire, j'ai en entrée une variable qui correspond au texte recherché
txtsearch varchar
J'ai d'autres variables qui viennent se rajouter :
var_liste_table record; (boucle sur les noms de table)
var_liste_column record; (boucle sur les noms de champ)
var_searchtxt_ok varchar []; (variable qui me récupère la liste des table - colonne qui contiennet le caractère recherché)
var_requete varchar; (Récupère la requête à exécuter)
Je fais donc mes boucles sur les tables :
FOR var_liste_table IN SELECT tablename FROM pg_tables LOOP
Puis sur les colonnes :
FOR var_liste_column IN SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=var_liste_table.tablename LOOP
Et je lance ma requête, et c'est là ou je bloque (forcément c'est la partie la moins facile). Je crée ma requête :
var_requete=
'SELECT array_cat(coalesce(var_searchtxt_ok,''{}''),(SELECT array_agg('''||var_liste_table.tablename::varchar||' - '||var_liste_column.COLUMN_NAME::varchar||''') FROM '::varchar||var_liste_table.tablename ||'
WHERE '||var_liste_column.COLUMN_NAME::varchar||' like '''::varchar||txtsearch||'%'' OR '::varchar||var_liste_column.COLUMN_NAME::varchar||' LIKE ''%'||txtsearch||'%'' OR
'||var_liste_column.COLUMN_NAME::varchar||' LIKE ''%'||txtsearch||''')::varchar[]) INTO var_searchtxt_ok;'::varchar;
et je l'exécute :
EXECUTE requete;
Et j'ai ce message qui s'affiche :
ERROR: column "var_searchtxt_ok" does not exist
J'ai déjà créé des fonctions utilisant cette requête mais sans avoir besoin de passer par une variable qui contient la requête et u Exécute. Le problème, c'est que si je lance directement ma requête postgres me dit :
ERROR: column "var_liste_table.tablename" does not exist
Je suis donc bloqué à cette étape là, sans vraiment comprendre le raisonnement de postgres sur des variables pourtant déclarés qu'il semble oublier...
Je vous remercie de votre aide.
Geo-x
Bonjour @ tous,
Je souhaiterais obtenir la sélection des résultats d'un tableau sur une seule ligne, sachant qu'il n'y a par colonne, qu'une seule valeur, je m'explique dans le cas suivant :
LIGNE 1 val1 NULL
LIGNE 2 NULL val2
Et moi je souhaiterais :
LIGNE 1 val1 val2
Et voici un exemple concret, qui vous permettra de mieux comprendre le contexte (val1 et val2 étant en fait les doublons contenus dans les colonnes):
SELECT DISTINCT commune,longueur FROM
(SELECT commune, longueur FROM e WHERE commune IS NOT NULL OR longueur IS NOT NULL GROUP BY commune,longueur HAVING Count(*) > 1)foo
Précision complémentaire, le but étant d'éviter la lourde mise en place d'un SELECT façon :
SELECT DISTINCT commune,longueur FROM
(SELECT commune FROM e WHERE commune IS NOT NULL GROUP BY commune HAVING Count(*) > 1)foo,
(SELECT longueur FROM e WHERE longueur IS NOT NULL GROUP BY longueur HAVING Count(*) > 1)foo1
Merci d'avance.
Étant donné que mon prblème emmène irrésolument vers une impasse, je souhaiterais en savoir un peu plus par rapport à la fonction suivante :
On peux probablement faire une fonction sefiled() pour gérer ca.
Par avance merci à vous.
Geo-x
Bonjour Cedric et Gleu et merci de vos réponses.
Mon trigger actuel se déclenche sur un BEFORE INSERT et voici le code :
--$1 id_pk
DECLARE
col_champ record;
var_champ text;
var_valeur text;
var_insert_colonnes text;
var_insert_valeurs text;
var_nb_tuples integer;
requete text;
requete2 text;
requete3 text;
BEGIN
var_insert_colonnes='';
var_insert_valeurs='';
FOR col_champ IN SELECT DISTINCT COLUMN_NAME AS "champ" FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='table1' AND COLUMN_NAME<>'ogc_fid' AND COLUMN_NAME<>'id_table1' AND COLUMN_NAME<>'geometry'
LOOP
var_champ=replace(replace(replace(col_champ.champ::text,'()','NULL'),'(',''''),')','''');
requete2='SELECT coalesce(sum(count),0)::integer
FROM (SELECT DISTINCT '|| col_champ.champ||',count(DISTINCT '||col_champ.champ||') FROM table2
WHERE contains('''||CAST($2 As text)||''',table2.geometry) AND '||col_champ.champ||' IS NOT NULL AND '||col_champ.champ||'::text<>''''
GROUP BY '||col_champ.champ||')foo';
raise notice '%', requete2;
EXECUTE requete2 INTO var_nb_tuples;
raise notice '%', var_nb_tuples;
IF
var_nb_tuples=1
THEN
var_champ=col_champ.champ::text;
requete='SELECT DISTINCT '||var_champ||' AS "test",count(DISTINCT code_insee) FROM table2 WHERE ST_Contains('''||CAST($2 As text)||''',table2.geometry) GROUP BY '|| var_champ;
EXECUTE requete INTO var_valeur;
var_valeur=replace(var_valeur,'''','''''');
NEW.var_champ=var_valeur;
END IF;
END LOOP;
RETURN NEW;
END;
Malheureusement, mon nom de champ est traduit par une variable var_champ inclue dans une boucle.
Quand je fais simplement
NEW.var_champ=var_valeur;
Postgres me répond
record "new" has no field "var_champ"
et n'interpréte la variable en tant que variable.
J'ai trouvé la solution pour var_valeur! je fais une requête au format chaîne de caractères et je l'éxecute par la suite dans une variable :
requete='SELECT DISTINCT '||var_champ||' AS "test",count(DISTINCT code_insee) FROM table2WHERE ST_Contains('''||CAST(NEW.wkb_geometry As text)||''',table2.wkb_geometry) GROUP BY '|| var_champ;
EXECUTE requete INTO var_valeur;
Maintenant ce que je souhaiterais faire, c'est utiliser cette fonction dans un trigger avec une instruction BEFORE INSERT, comme ça ce sera plus facile à utiliser.
Grossomodo, il s'agit de la même chose, sauf que la seule chose que je ne sais pas faire c'est exécuter une instruction avec une variable contenant le nom de la colonne et un NEW.
Dans l'idée j'aimerais faire ça dans une boucle :
EXECUTE 'NEW.'||var_champ||'='''||var_valeur||'''';
Pour le moment, si je fais une raise notice, j'ai quand même une syntaxe correcte qui donne :
EXECUTE 'NEW.champ1='Bonjour';
mais j'ai quand même un message d'erreur de la part de postgres :
ERROR: syntax error at or near "NEW"
Bonjour Gleu et merci de votre aide.
J'ai corrigé le return integer en void. Si j'ai bien compris la documentation, il s'agit bien de préciser que l'on ne renvoi rien du tout ?
Concernant le var_valeur, il est déjà en type text mais visiblement, ça ne fonctionne pas quand même. J'ai du mal à récupérer la valeur d'un champ, voici les étapes auxquelles je procède :
1- Je mets mon nom de champ au format record en format texte
var_champ=replace(replace(replace(col_champ.champ::text,'()','NULL'),'(',''''),')','''');
2-J'essaie (désespérément de récupérer la valeur de la table 2 pour un champ donné :
var_valeur= test FROM (SELECT DISTINCT var_champ AS "test",count(DISTINCT code_insee) FROM table2 WHERE contains($2,table2.wkb_geometry) GROUP BY var_champ)foo;
3- Je construis ma requête qui me permettra de tout intégrer (en INSERT INTO) avec la partie colonnes (précision, compteur_stop=nombre de colonnes dans le record):
IF
var_insert_colonnes='' AND compteur<>compteur_stop
THEN
var_insert_colonnes=var_champ||',';
ELSIF
var_insert_colonnes<>'' AND compteur<>compteur_stop
THEN
var_insert_colonnes=var_insert_colonnes||var_champ||',';
ELSIF
var_insert_colonnes<>'' AND compteur=compteur_stop
THEN
var_insert_colonnes=var_insert_colonnes||var_champ;
END IF;
et la partie valeurs :
IF
var_insert_valeurs='' AND compteur<>compteur_stop
THEN
var_insert_valeurs=''''||replace(replace(replace(var_valeur::varchar,'()','NULL'),'(',''''),')','''')||''',''';
ELSIF
var_insert_valeurs<>'' AND compteur<>compteur_stop
THEN
var_insert_valeurs=var_insert_valeurs||replace(replace(replace(var_valeur::varchar,'()','NULL'),'(',''''),')','''')||''',''';
ELSIF
var_insert_valeurs<>'' AND compteur=compteur_stop
THEN
var_insert_valeurs=var_insert_valeurs||replace(replace(replace(var_valeur,'()','NULL'),'(',''''),')','''')||'''';
END IF;
4-En sortie de boucle il me met tout ça dans une requête en INSERT INTO qu'il exécute.
Le problème, c'est que pour le moment, var_valeur prend pour valeur le nom de la colonne et non le contenu de l'enregistrement...