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).

#1 Re : Général » [comprendre] base accessible malgré service postgresql8.4 non démarré » 27/03/2013 10:22:25

Pas d'explication en vue ! Dommage, ça me perturbe bien ce truc. C'est pas bloquant mais j'aurais bien voulu comprendre !

J'ajoute une copie d'écran au cas mon message ne serait pas suffisamment clair :

service postgresql

#2 Général » [comprendre] base accessible malgré service postgresql8.4 non démarré » 22/03/2013 15:31:01

fr2ed
Réponses : 2

Bonjour,

J'aimerais comprendre le fonctionnement de postgresql 8.4 sur des postes windows 7 64bits.

J'utilise postgresql depuis plusieurs années et jusqu’à présent, il m'avait semblé que le moteur du sgbd tournait grâce a un service windows "postgresqlxx".

Or je viens de m'apercevoir, sur 2 postes W7 64 bits que je viens de configurer, que mes bases postgresql sont parfaitement fonctionnelles et accessibles, alors que le service postgresql n'est pas démarré, et ne veux pas démarrer ! Et je n'ai pas trouvé d'autres services relié à postgresql !

Je suis un peu confusionné ! !

Merci de vos précisions...

#3 Re : Général » jointures avec 10 tables » 31/08/2012 09:56:41

Merci ! Les JOIN sont beaucoup, beaucoup plus clair pour moi maintenant.  Et ma requête fonctionne parfaitement smile

Une seule remarque : je suis surpris que le constructeur graphique de pgAdminIII génère du code avec des WHERE !

Bonne journée...

#4 Re : Général » jointures avec 10 tables » 31/08/2012 08:47:36

ok, je crois comprendre d'où vient mon problème : en fait, les JOIN font partie de la section FROM, donc :

- il ne peut pas y avoir la même table dans le FROM et dans les JOIN.

- il ne peut pas y avoir 2 fois la même table dans les JOIN.

- je ne peux pas faire référence à une table dans les ON si elle n'est pas déjà déclarée dans le FROM ou les JOIN.


Vous me confirmez ?

#5 Général » jointures avec 10 tables » 30/08/2012 16:50:39

fr2ed
Réponses : 5

Bonjour,

J'ai créé une vue à partir de 10 tables.

Ayant utilisé le constructeur graphique de requête de pgAdminIII, j'ai obtenu ceci :

SELECT 
  table1.champ1, 
  table2.champ1, 
  table2.champ2, 
  table3.champ1, 
  table4.champ1, 
  table4.champ2, 
  table4.champ3, 
  table5.champ1, 
  table6.champ1, 
  table7.champ1, 
  table8.champ1, 
  table9.champ1, 
  table10.champ1,
  table10.champ2
FROM 
  public.table2, 
  public.table10, 
  public.table1, 
  public.table8, 
  public.table5, 
  public.table4, 
  public.table3, 
  public.table6, 
  public.table7, 
  public.table9
WHERE 
  table2.champ3 = table1.champ2 AND
  table2.champ4 = table8.champ6 AND
  table2.champ1 = table6.champ1 AND
  table2.champ2 = table7.champ2 AND
  table10.champ2 = table2.champ2 AND
  table8.champ3 = table5.champ2 AND
  table5.champ5 = table4.champ3 AND
  table3.champ4 = table5.champ3

Ça marche parfaitement, mais j'aurais préféré utiliser des JOIN à la place des WHERE, histoire d'optimiser les performances.

Mais impossible de trouver la syntaxe correcte pour les JOIN sur 10 tables !

Merci de votre aide...

#6 Re : PL/pgSQL » [Résolu] Créér des vues avec boucles et conditions ! » 29/08/2012 15:33:35

C'est exactement ce qu'il me faut ! Merci beaucoup.

Je suis maintenant partagé entre la joie d'avoir enfin une solution à mon problème, et le désespoir d'avoir passé tant de temps sur les procédures, alors qu'au final une "simple requête sql" suffit !!

On est bien peu de chose... wink

Bravo et encore merci.

#7 Re : PL/pgSQL » [Résolu] Créér des vues avec boucles et conditions ! » 29/08/2012 14:15:00

c'est du varchar.

J'ai oublié de préciser que je suis en Postgresql 8.4 !

#8 PL/pgSQL » [Résolu] Créér des vues avec boucles et conditions ! » 29/08/2012 14:00:38

fr2ed
Réponses : 4

Bonjour,

voici ma situation :

j'ai une table avec la structure suivante :

table1 :

  • |   ID   |   REF   |

  • |    1    |             |

  • |    2    |    A;B   |

  • |    3    |    A;B   |

  • |    4    |  A;B;C |

  • |    5    |            |

  • |    6    |     C     |

  • |    7    |   B;C    |

  • |    8    |      B    |

  • |    9    |            |

  • |   10   |    A;B   |


et je souhaiterai obtenir le résultat suivant :


vue1 :

  • |   ID   |   REF   |

  • |    2    |    A     |

  • |    2    |    B     |

  • |    3    |    A     |

  • |    3    |    B     |

  • |    4    |    A     |

  • |    4    |    B     |

  • |    7    |    B     |

  • |    8    |    B     |

  • |   10   |    A     |

  • |   10   |    B     |


vue2 :

  • |   ID   |   REF   |

  • |    4    |    C     |

  • |    6    |    C     |

  • |    7    |    C     |


Et je n'y arrive pas ! Je m'embourbe depuis 3 jours dans les erreurs de syntaxe avec les CREATE VIEW, les LOOP et les IF ! !

Si quelqu'un a une idée..... je le remercie d'avance.

#9 Re : PL/pgSQL » [Résolu] fonction qui ne marche pas en trigger » 27/08/2012 15:34:44

select((select length(nom) from tcommunes where oid=19694)/2)
sortie de données : 3

Toujours rien avec le code de gleu !
Je viens de refaire un test avec la fonction sans trigger : ça marche nickel avec un select test_while() ! !

J'ai peut-être un souci de paramétrage ou autre sur mon serveur postgresql 8.4 !

Je teste sur un autre serveur ......



EDIT : bon pareil sur un autre serveur identique ! !

Pris d'un doute, je vire mes tables et fonctions de tests.

Je fais un copier coller de la doc posgresql, section trigger :

CREATE TABLE emp (
    nom_employe       text NOT NULL,
    salaire           integer
);
        
CREATE TABLE emp_audit( 
    operation         char(1)   NOT NULL,
    tampon            timestamp NOT NULL,
    id_utilisateur    text      NOT NULL,
    nom_employe       text      NOT NULL,
    salaire           integer
);
        
CREATE OR REPLACE FUNCTION audit_employe() RETURNS TRIGGER AS $emp_audit$
BEGIN
    --
    -- Ajoute une ligne dans emp_audit pour refléter l'opération réalisée
    -- sur emp,
    -- utilise la variable spéciale TG_OP pour cette opération.
    --
    IF (TG_OP = 'DELETE') THEN
        INSERT INTO emp_audit SELECT 'D', now(), user, OLD.*;
        RETURN OLD;
    ELSIF (TG_OP = 'UPDATE') THEN
        INSERT INTO emp_audit SELECT 'U', now(), user, NEW.*;
        RETURN NEW;
    ELSIF (TG_OP = 'INSERT') THEN
        INSERT INTO emp_audit SELECT 'I', now(), user, NEW.*;
        RETURN NEW;
    END IF;
    RETURN NULL; -- le résultat est ignoré car il s'agit d'un trigger AFTER
END;
$emp_audit$ language plpgsql;
        
CREATE TRIGGER emp_audit
    AFTER INSERT OR UPDATE OR DELETE ON emp
    FOR EACH ROW EXECUTE PROCEDURE audit_employe();

J'execute, je fais un update de emp : ok le trigger marche !

je modifie rapidement l'exemple en incorporant le code de la boucle while :

CREATE OR REPLACE FUNCTION audit_employe() RETURNS TRIGGER AS $emp_audit$
DECLARE
compteur integer := 1;
-- total integer :=5;
total integer := (select((select length(nom) from tcommunes where oid=19694)/2));
BEGIN
    --
    -- Ajoute une ligne dans emp_audit pour refléter l'opération réalisée
    -- sur emp,
    -- utilise la variable spéciale TG_OP pour cette opération.
    --
while total > compteur    
loop 
IF (TG_OP = 'DELETE') THEN
        INSERT INTO emp_audit SELECT 'D', now(), user, OLD.*;
        RETURN OLD;
    ELSIF (TG_OP = 'UPDATE') THEN
        INSERT INTO emp_audit SELECT 'U', now(), user, NEW.*;
       -- RETURN NEW;
    ELSIF (TG_OP = 'INSERT') THEN
        INSERT INTO emp_audit SELECT 'I', now(), user, NEW.*;
      --  RETURN NEW;
    END IF;
compteur := compteur +1;
end loop;
    RETURN NULL; -- le résultat est ignoré car il s'agit d'un trigger AFTER
END;
$emp_audit$ language plpgsql;

et là....miracle : ça marche !

Soulagé, même si je ne comprends pas pourquoi le 1er code ne marchait pas !

Surement qu'a force de faire des "drop-create-table-function" dans tout les sens, ça faisait une bouillie pas très digeste pour postgresql.

Pour information, ces tests avaient pour objectif de me permettre de réaliser un trigger qui, lors de la modification d'un champ type "commentaire", doit analyser le contenu , et en fonction de ce contenu réaliser une boucle de type select.

Voilà, merci pour votre aide qui m'a été bien utile dans la compréhension des boucles et déclencheurs.

#10 Re : PL/pgSQL » [Résolu] fonction qui ne marche pas en trigger » 27/08/2012 14:52:17

compteur integer := 1;
total integer := 5;
--total integer := (select((select length(nom) from tcommunes where oid=19694)/2));

toujours aucune ligne insérée !!

Est-il possible de vérifier l'execution d'un trigger  (log ou autres) ?

On dirait que c'est le mix loop+trigger qui le chagrine ! ? !

Ne maitrisant pas encore le sujet, j'avais fait des tests : loop sans trigger ok, trigger sans loop ok !

Depuis que j'essaie de mélanger les 2 : rien !

#11 Re : PL/pgSQL » [Résolu] fonction qui ne marche pas en trigger » 27/08/2012 13:48:33

Merci pour les indications.... j'ai encore un peu de mal avec les boucles !

j'ai modifié mon script avec les return selon ce que j'ai pu comprendre :

CREATE OR REPLACE FUNCTION test_while() RETURNS trigger AS $BODY$

DECLARE
compteur integer := 1;
total integer := (select((select length(nom) from tcommunes where oid=19694)/2));
BEGIN
   
while total > compteur
loop

insert into test_audit (nom_employe,salaire) values ('fred',(select (1+compteur)));
RETURN NEW;
compteur :=compteur+1;
end loop;
RETURN NULL;
END
$BODY$
LANGUAGE plpgsql VOLATILE;

...mais le résultat est toujours le même : pas d'erreur mais aucune insertion dans ma table !

Question subsidiaire : quand je modifie une fonction trigger, je pars du principe que le trigger va lancer la fonction modifié donc inutile de le re-créer ! J'ai bon ??

#12 PL/pgSQL » [Résolu] fonction qui ne marche pas en trigger » 23/08/2012 17:00:47

fr2ed
Réponses : 7

J'ai créé la fonction suivante pour tester la boucle while :

CREATE OR REPLACE FUNCTION test_while() RETURNS void AS $BODY$

DECLARE
compteur integer := 1;
total integer := (select((select length(nom) from tcommunes where oid=19694)/2));
BEGIN
   
while total > compteur
loop

insert into test_audit (nom_employe,salaire) values ('fred',(select (1+compteur)));
compteur :=compteur+1;
end loop;
END
$BODY$
LANGUAGE plpgsql VOLATILE;

Cette fonction marche très bien !

Mais je souhaite la déclencher avec un trigger, donc je la modifie comme suit :

CREATE OR REPLACE FUNCTION test_while() RETURNS trigger AS $BODY$

DECLARE
compteur integer := 1;
total integer := (select((select length(nom) from tcommunes where oid=19694)/2));
BEGIN
   
while total > compteur
loop

insert into test_audit (nom_employe,salaire) values ('fred',(select (1+compteur)));
compteur :=compteur+1;
end loop;
END
$BODY$
LANGUAGE plpgsql VOLATILE;

je crée mon trigger pour que ma procédure se lance à la modification de ma table test :

CREATE TRIGGER trigger_audit
    AFTER UPDATE ON test
    EXECUTE PROCEDURE test_while();

Mais quand je modifie ma table test... rien ne se passe ! ! ! Je ne comprends vraiment pas.
Merci de votre aide...

#13 Re : PL/pgSQL » Je n'arrive pas à utiliser les structures de contrôles » 11/06/2012 13:27:21

Merci pour ces précisions.

Je teste ça dès que je peux...


EDIT: J'ai réussi à faire ma boucle dans une procédure stockée. Merci

#14 PL/pgSQL » Je n'arrive pas à utiliser les structures de contrôles » 07/06/2012 17:37:05

fr2ed
Réponses : 3

Bonjour,
je voudrais réaliser une requête avec des boucles. J'ai étudié la doc autant que possible mais je ne parviens pas à mettre en application.

Par exemple le sql suivant :

FOR i IN 1..2 LOOP

select champ from matable;

END LOOP;



me donne systématiquement l'erreur :

ERREUR:  erreur de syntaxe sur ou près de « FOR »
LINE 1: FOR i IN 1..2 LOOP
        ^

********** Erreur **********

ERREUR: erreur de syntaxe sur ou près de « FOR »
État SQL :42601
Caractère : 1

-----------------

J'ai essayé en direct avec pgadmin et avec plsql : pareil !

J'ai loupé quoi ? ?

on peut faire des boucles dans pgadmin ?
il faut créer des fonctions ?
pgscript ?

Je suis perdu ! ! Merci de votre aide.

Pied de page des forums

Propulsé par FluxBB