PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

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

#126 Re : PL/pgSQL » Retour de résultat vide d'une fonction » 26/08/2013 18:39:09

Bonsoir Gleu et merci de votre réponse.

Si je reprend l'exemple que j’avais mis au début, voici ce que je souhaiterais faire :

cas 1 : S'il y a plusieurs résultats 'a','a' et 'x' alors je ne fais rien
cas 2 : Si les résultats sont les suivants 'e','e','e', alors, au moment de l'insertion de l'objet je récupère pour ce champ là la valeur 'e' et je l’intègre automatiquement à l'objet.

Donc voici mon raisonnement :

* count(var_valeur) permet de vérifier combien il y a de lignes avec des valeurs différentes. Dans le cas 1 : 2 lignes, je ne fais donc rien et dans le cas 2 : 1 ligne, je passe donc à l'étape suivante. Depuis le post, j'avais en effet corrigé certaines choses, maintenant la requête donne ceci :

var_nb_tuples=coalesce(sum(count),0)::integer FROM (SELECT DISTINCT col_champ.champ,count(DISTINCT code_insee) FROM table2 WHERE contains($2,table2.wkb_geometry) GROUP BY col_champ.champ)foo;

* var_valeur::varchar en fait ce que je souhaite, c'est obtenir cette valeur unique contenu dans le champ col_champ.champ. Pour ce faire j'ai tenté de faire mais le résultat n'est pas très concluant, visiblement il me renvoi toujours la valeur de la variable col_champ.champ...

var_valeur=EXECUTE 'SELECT '||col_champ.champ||') FROM table2 WHERE contains((SELECT wkb_geometry FROM table1 WHERE ogc_fid='||$1||'),wkb_geometry))foo'

* RETURNS integer oui, dans l'idée, la fonction fait directement un update en base et ne renvoi rien de particulier.

#127 PL/pgSQL » Retour de résultat vide d'une fonction » 26/08/2013 10:45:09

Geo-x
Réponses : 12

Bonjour @ tous,

j'ai un souci de fonction dans postgres/postgis. Je m'explique :

J'ai une table1 qui contient des objets surfaciques
J'ai une table 2 qui contient des ponctuels
Entre les deux tables, les champs sont identiques

Ce que je souhaite faire, c'est récupérer les valeurs ponctuels se toruvant dans les surfaciques mais seulement si les valeurs de la table2 sont unique. Par exemple, s'il y a trois ponctuels dans un surfacique, mais que les valeurs de ces trois points das un champ identique sont 'a','a' et 'x', je ne les prends pas en revanche si la valeur est 'e','e','e', alors je mets à jour ce champ dans ma table1.

Pour réaliser ces manipulations, j'ai réalisé la fonction suivante (avec en entrée, l'identifiant unique de ma zone)

CREATE OR REPLACE FUNCTION fonction("$1" integer)
  RETURNS integer AS
$BODY$

DECLARE

	col_champ record;
	col_champ_txt character varying(125);
	var_valeur record;
	var_valeur_txt character varying(125);

FOR col_champ IN SELECT DISTINCT COLUMN_NAME AS "champ" FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='table1'

	LOOP
		
		EXECUTE 'SELECT DISTINCT "'||col_champ.champ||'" FROM table2 
		WHERE contains((SELECT wkb_geometry FROM table1 WHERE ogc_fid='||$1||'),wkb_geometry)'
		INTO var_valeur;

		IF

			count(var_valeur)='1'

		THEN
		
			col_champ_txt=replace(replace(col_champ.champ::varchar,'(',''),')','');
			var_valeur_txt=replace(replace(replace(var_valeur::varchar,'()','NULL'),'(',''''),')','''');
			EXECUTE 'UPDATE table1 SET '||col_champ_txt||'='||var_valeur_txt||' WHERE ogc_fid='||$1;

		END IF;
		
	END LOOP;
	
RETURN 1;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE SECURITY DEFINER
COST 100;
ALTER FUNCTION fonction(integer) OWNER TO postgres;

Mais ce que je ne comprend pas,  peu importe ce que j'intégre, mon record var_valeur se retrouve toujours vide en sortie.

Est-ce que vous avez une piste pour m'aider à comprendre d'ou peut venir le problème?

Par avance merci.

#128 PL/pgSQL » Utilisation d'un alias dans un SELECT » 19/08/2013 15:20:02

Geo-x
Réponses : 1

Bonjour @ tous,

ma question va peut-être vous paraître simpliste, mais je souahitais savoir s'il était possible de faire une requête SQL avec un SELECT champ1 AS (SELECT ...).

Par exemple, si je souhaite que ma colonne porte le nom de l'année en cours :

SELECT evenement AS extract('year' from now())

Bon, je ne vous cache pas avoir essayé par de multiple façons avant de poster sur le forum et je n'y suis pas arrivé, mais peut-être est-ce parce que je n'ai pas utilisé la bonne manière de faire ?!

Par avance merci de votre aide.

Geo-x

#129 Re : PL/pgSQL » RESOLU - Sélectionner la définition d'une fonction trigger » 18/07/2013 15:38:59

Bonjour rjuju,

c'est exactement ça que je cherchais et surtout ce fameux champs prosrc.

Merci beaucoup de votre aide.

#130 Re : PL/pgSQL » Group By problème » 17/07/2013 14:46:44

Dans ce cas, ta première requête est bonne, il ne te reste qu'à rempalcer * par les noms de tes champs. Par exemple :

SELECT id,view_id, max(date) as last_date FROM postr GROUP BY view_id,id;

#131 Re : PL/pgSQL » Group By problème » 17/07/2013 11:24:05

Bonjour ant,

je ne suis pas sûr de bien comprendre ce que tu souhaites comme résultat.

Peut-être la requête suivante pourra-t-elle répondre à ta question :

SELECT array_agg(id),view_id, max(date) as last_date FROM postr GROUP BY view_id;

Si la fonction array_agg() ne fonctionne pas, lances d'abord le code suivant dans la base de données voulue:

CREATE AGGREGATE array_agg (
        sfunc = array_append,
        basetype = anyelement,
        stype = anyarray,
        initcond = '{}'
);

En fait, cela va te créer un tableau de résultat.

#132 PL/pgSQL » RESOLU - Sélectionner la définition d'une fonction trigger » 17/07/2013 10:20:24

Geo-x
Réponses : 2

Bonjour @ tous,

comme indiqué dans le titre je souhaiterais savoir comment il est possible de sélectionner la définition d'une fonction trigger à partir d'une requête SQL, tout en prenant en compte que je suis sur la version 8.4 de postgres.

Le but de cette requête est de chercher à partir d'un nom de champ ou d'une table, les triggers utilisant ce champ ou cette table.

Par avance merci de votre aide

Geo-x

#133 Re : PL/pgSQL » Sélection et concaténation de champ » 10/06/2013 08:25:03

C'est le genre de problème auquel on s'expose quand on ne donne pas son numéro de version

Oui Gleu, vous avez tout à fait raison. Mais d'un autre côté, l'avantage, c'est que j'ai appris quelque chose qui me servira sur la version 9.x de postgres wink

#134 Re : PL/pgSQL » Sélection et concaténation de champ » 06/06/2013 17:26:16

Ca fonctionne à merveille!

Merci pour votre précieuse aide.

Geo-x

#135 Re : PL/pgSQL » Sélection et concaténation de champ » 06/06/2013 10:47:15

Bonjour kenrio,

Cette remarque est pertinente, et en effet, c'est quelque chose qui est prévu au cours de l'année.

#136 Re : PL/pgSQL » Sélection et concaténation de champ » 06/06/2013 09:00:42

Bonjour Gleu,

D'abord, merci pour la rapidité de vos interventions et la qualité de vos réponses.

Par rapport à votre commentaire : "Oulala, je ne sais pas comment vous arrivez à une requête comme ça"

Il est vrai que j'ai tendance parfois à chercher le résultat par des requêtes complexes souvent issus d'une méconnaissance de certaines méthodes.

Aujourd'hui, c'est le WITH que je n'ai jamais utilisé en requête (bien que je l'ai déjà vu avec les OID's).

Malheureusement, cette requête ne fonctionne pas :

ERROR: syntax error at or near "WITH tmp"
État SQL :42601
Caractère : 1

Très probablement car ma version de postgres n'est pas compatible avec cette commande : "PostgreSQL 8.3.10, compiled by Visual C++ build 1400"

Il est également à noter que la fonction string_agg() n'existe visiblement pas sous cette version de postgres.

Geo-x

#137 PL/pgSQL » Sélection et concaténation de champ » 05/06/2013 14:09:34

Geo-x
Réponses : 9

Bonjour @ tous,

j'aurais besoin de vos lumières pour résoudre un problème au niveau d'une sélection, je m'explique :

1- J'ai une table qui est formée de la façon suivante :

ID	NOM
1	coucou
2	chouette
1	coucou
2	coucou	
1	chouette
1	chouette

2- Je souhaiterais à partir de cette table sortir une sélection qui me donnerait :

ID	NOM
1	2 x coucou - 2 x chouette
2	1 x coucou - 1 x chouette

3- Pour arriver à ce résultat, j'ai bien tenté de faire un array en l'intégrant à la requête suivante :

SELECT replace(replace(replace(replace(replace(replace(
array(SELECT COALESCE(count("NOM"), 0::bigint)::text ||' x '|| "NOM" AS colonne
FROM table
WHERE table."ID" IS NOT NULL
GROUP BY table."ID",table."NOM" ORDER BY "NOM")::text,',',' - '),'{"','- '),'"',''),'}',''),'{NULL','Pas d''information'),'- NULL','')

4- Mais le problème, c'est qu'avec ce genre de requête j'arrive toujours au résultat suivant :

ID	NOM
1	3 x coucou - 3 x chouette
2	3 x coucou - 3 x chouette

Avez-vous une solution à ce problème?

Geo-x

#138 Re : PL/pgSQL » order by sur un champ non sélectionné » 29/05/2013 16:56:58

Bonjour,

Oui il est vrai que j'avais oublié de préciser que je faisais un SELECT DISTINCT, donc du coup, ça me donne ça :

ERROR:  for SELECT DISTINCT, ORDER BY expressions must appear in select list

Alors, pour que cela fonctionne, je viens de trouver, il faut faire un GROUP BY suivi de tous les champs sélectionnés.

Merci!

Geo-x

#139 PL/pgSQL » order by sur un champ non sélectionné » 29/05/2013 11:10:38

Geo-x
Réponses : 2

Bonjour @ tous,

J'ai une table qui contient des noms de rue, avec un champ qui décompose chaque partie du nom et un champ qui fait la concaténation avec des modifications.

Par exemple : C1 : 'CHE' C2 : 'DU' C3 : 'MOULIN' C4 : 'Chemin du Moulin'

Donc, ce que je souhaiterais faire, c'est un tri à partir du libellé 'Moulin' et non pas à partir de l'article 'Chemin', mais je ne veux pas non plus sélectionner C3.

Voyez-vous une méthode qui permette de trier à partir d'un champ que l'on a pas sélectionné ou de ne pas faire apparaitre un champ sélectionné?!

Par avance merci.

Geo-x

#140 Re : PL/pgSQL » RESOLU - Utilisation de la fonction initcap() avec caractères spéciaux » 24/04/2013 15:52:52

Bonjour @tous,

j'ai trouvé comment faire, je vous livre donc cette solution qui je l'espère vous sera utile.

1- Créez deux fonctions permettant la mise en majuscule et en minuscule des caractères spéciaux

CREATE OR REPLACE FUNCTION maj_specialchar(text)
  RETURNS text AS
$BODY$
DECLARE
    input_string text := $1;
BEGIN

input_string := translate(input_string, 'âãäåa', 'ÂÃÄÅA');
input_string := translate(input_string, 'èéêëe', 'ÈÉÊËE');
input_string := translate(input_string, 'ìíîïìi', 'ÌÍÎÏÌI');
input_string := translate(input_string, 'óôõöo', 'ÓÔÕÖO');
input_string := translate(input_string, 'ùúûüu', 'ÙÚÛÜU');

return input_string;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;
ALTER FUNCTION maj_specialchar(text) OWNER TO postgres;
CREATE OR REPLACE FUNCTION min_specialchar(text)
  RETURNS text AS
$BODY$
DECLARE
    input_string text := $1;
BEGIN

input_string := translate(input_string, 'ÂÃÄÅA', 'âãäåa');
input_string := translate(input_string, 'ÈÉÊËE', 'èéêëe');
input_string := translate(input_string, 'ÌÍÎÏÌI', 'ìíîïìi');
input_string := translate(input_string, 'ÓÔÕÖO', 'óôõöo');
input_string := translate(input_string, 'ÙÚÛÜU', 'ùúûüu');

return input_string;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;
ALTER FUNCTION min_specialchar(text) OWNER TO postgres;

2- Et ensuite je lance la focntion suivante:

-- Function: initcap_perso(character varying)

-- DROP FUNCTION initcap_perso(character varying);

CREATE OR REPLACE FUNCTION initcap_perso(character varying)
  RETURNS character varying AS
$BODY$
DECLARE
	var_decomposition_nom record;
	var_nom_corrige varchar;
BEGIN

var_nom_corrige='';

FOR var_decomposition_nom IN SELECT regexp_split_to_table(trim($1),' ')AS nom
LOOP
	IF
		length(var_decomposition_nom.nom)>0
	THEN
		var_nom_corrige=var_nom_corrige||maj_specialchar(UPPER(substring(var_decomposition_nom.nom from 1 for 1)))||min_specialchar(lower(substring(var_decomposition_nom.nom from 2 for length(var_decomposition_nom.nom)-1)))||' ';
	END IF;

END LOOP;

var_nom_corrige=trim(var_nom_corrige);

return var_nom_corrige;

END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;
ALTER FUNCTION initcap_perso(character varying) OWNER TO postgres;

Qui décompose les différents mots contenus dans une cellule, qui les traite un par un, et qui les recompose à l'aide d'une boucle.

@ très vite

Geo-x

#141 PL/pgSQL » RESOLU - Utilisation de la fonction initcap() avec caractères spéciaux » 18/04/2013 15:25:58

Geo-x
Réponses : 1

Bonjour @ tous,

j'essaie désespérément de trouver une solution pour utiliser la fonction initcap() (qui met en majuscule la première lettre de chaque mot dans une chaîne de caractères) avec des caractères spéciaux, dans une BDD en LATIN1.

Malheureusement, quand j'ai des caractères spéciaux, la fonction à tendance à réagir différemment :

Par exemple, si je fais un initcap() sur une valeur 'BIRÉGES DE ÔTRÜC' ça me donne "BirÉGes De ÔTrÜC"

Connaissez-vous une alternative qui pourrait fonctionner? parce que j'imagine ne pas être le seul à avoir rencontré le problème...

D'avance merci!

Geo-x

#142 PgAdmin3 » Retrouver une fonction postgis inexistante » 11/01/2013 15:15:38

Geo-x
Réponses : 1

Bonjour @ tous,

Je souhaiterais utiliser la fonction postgis ST_snap(geometry, geometry, numeric) mais j'ai le message suivant :
ERROR:  function st_snap(geometry, geometry, numeric) does not exist

Alors ma qeustion est simple :
est-il possible de retrouver les fonctions postgis qui ne sont pas en base pour pouvoir les créer ou bien faut-il installer la toutes dernière version?

Merci.

Geo-x

#143 Re : PL/pgSQL » Segmentation d'une ligne à partir de points » 09/01/2013 10:38:51

Je relance un peu le sujet car je souhaiterais savoir s'il est possible de segmenter une ligne masi sans point (par exemple en définissant une longueur de segmentation).

J'ai vu qu'il existait la fonction segmentize(geometry,length) pour les polygones, mais je n'ai pas trouvé d'équivalence pour les lignes.

#145 Re : PL/pgSQL » Extrait du nombre de caractères (d'un caractère spécifique) » 08/01/2013 10:33:48

En effet, ça fonctionne à merveille, merci beaucoup.

En revanche j'ai du mal à comprendre comment la fonction regexp_replace fonctionne.

#146 PL/pgSQL » Extrait du nombre de caractères (d'un caractère spécifique) » 07/01/2013 16:26:29

Geo-x
Réponses : 4

Bonjour à tous et tout d'abord très bonne année 2013!

Je me permet de solliciter votre aide, sur les fonctions et opérateurs de chaînes de caractères sur postgres.

Ce que je souhaiterais faire, c'est extraire le nombre de caractères spécifié présent dans une chaîne de caractères.

Par exemple, j'ai une chaîne définit comme suit : frtrfr/ioioioi/zzaazd

Et je souhaiterais connaitre le nombre de : / présents dans cette chaîne.

La fonction me retournerais donc : 2

Je n'arrive pas à toruver mon bonheur dans l'aide postgres : http://docs.postgresql.fr/8.1/functions-string.html alors je me suis dit que vous auriez peut-être la réponse à ma question.

Merci d'avance.

Geo-x

#147 Général » Retour d'expérience (REX) sur la gestion des triggers / Vues » 29/11/2012 17:09:36

Geo-x
Réponses : 0

Bonjour @ tous,

je possède plusieurs base de données dont chacune d'entre elle contient des vues et des triggers. Ce que j'aimerais faire c'est pouvoir avoir une vue d'ensemble de quel trigger impact quel table, quel champ, idem pour les vues. En clair, de la gestion générale.

Auriez-vous des expériences similaires ? et comment faites-vous ?

Meric d'avance.

Geo-x

#148 Re : PL/pgSQL » Segmentation d'une ligne à partir de points » 29/11/2012 10:00:14

Bonjour,

oui, ma requête contient une multitude de fonctions géographique dont l'aboutissement final est la segmentation, mais l'intersection, elle, ne résout pas mon problème.

Mais merci quand même ;-)

#149 PL/pgSQL » Segmentation d'une ligne à partir de points » 16/11/2012 18:42:22

Geo-x
Réponses : 4

Bonjour @ tous,

Je possède des points (en multipoints et en séparés selon le besoin) et une ligne intersectant ces points.

Ce que je souhaiterais faire c'est, segmenter ma ligne en focntion des points qu'elle rencontre.

Connaissez-vous une technique qui pemettrait de réaliser cette manipulation?

Merci.

Geo-x

#150 Re : PL/pgSQL » Répercution des résultats d'une fonction dans ma table via une vue » 27/09/2012 08:50:52

Bonjour,

J'ai finalement réussi à m'en sortir, en ne faisant plus comme ça :

RAISE NOTICE 'UPDATE %', 'UPDATE bd_adresse SET dom_num='''||$4||$5||'''WHERE ogc_fid='''||$6||'''';

par

UPDATE bd_adresse SET dom_num=$4||$5 WHERE ogc_fid=$6;

Tout simplement.

Cdt

Pied de page des forums

Propulsé par FluxBB