Vous n'êtes pas identifié(e).
Pages : 1
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 :
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...
Merci ! Les JOIN sont beaucoup, beaucoup plus clair pour moi maintenant. Et ma requête fonctionne parfaitement
Une seule remarque : je suis surpris que le constructeur graphique de pgAdminIII génère du code avec des WHERE !
Bonne journée...
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 ?
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...
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...
Bravo et encore merci.
c'est du varchar.
J'ai oublié de préciser que je suis en Postgresql 8.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.
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.
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 !
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 ??
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...
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
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.
Pages : 1