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 Général » Les trigger » 26/12/2008 16:42:47

Katagoto
Réponses : 1

Bonjour à toutes et à tous,

Voilà, j'ai un trigger à faire sur toutes les tables comportant une colonne donnée, dois-je faire tout mes tables une par un en faisant copié coller ou il y a une autre méthode ?

Par avance merci de votre aide

#3 Re : Général » Un problème de type » 13/11/2008 23:57:42

ok, et pour un timestamp PHP (time() 32 chiffres), je privéligie quoi ?

Par avance merci de votre aide

#4 Général » Un problème de type » 13/11/2008 18:43:54

Katagoto
Réponses : 3

Bonjour à toutes et à tous,

Voilà, je me pose une question, sur plusieurs tables, environ 20, j'utilise fréquemment une colonne pour stocker un nombre compris généralement entre 0 et 4, voir 0 et 9, vaut-il mieu prendre un smallint ou un numeric(1,0) ?

Par avance merci de votre aide

#5 Re : PL/pgSQL » Fonctions variables et arguments » 29/10/2008 19:20:07

Pour claure le sujet :

CREATE OR REPLACE FUNCTION ri_ajoute_fils(nom_table character, nom character, pk_parent integer)
  RETURNS boolean AS
$BODY$
DECLARE
Bornes RECORD;
BEGIN
EXECUTE 'SELECT "BordDroit" FROM "'|| nom_table ||'" WHERE id= ' || pk_parent || '' INTO Bornes;

EXECUTE 'UPDATE '|| quote_ident (nom_table)||'
SET "BordDroit" = "BordDroit" + 2 
WHERE "BordDroit" >= '||Bornes||';';
 
EXECUTE 'UPDATE '|| quote_ident (nom_table)||'
SET "BordGauche" = "BordGauche" + 2 
WHERE "BordGauche" >= '||Bornes||';';
 
EXECUTE 'INSERT INTO '|| quote_ident (nom_table)||' ("BordDroit", "BordGauche", nom) 
VALUES ('||Bornes||', ('||Bornes||'+1), '''||nom||''');';
RETURN TRUE;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;

Merci à tous de votre aide

#6 Re : PL/pgSQL » Fonctions variables et arguments » 29/10/2008 14:55:26

Ca marche mieu, du moins, ça appel ma fonction, mais il y a un bug dans ma fonction :

CREATE OR REPLACE FUNCTION ri_ajoute_fils(nom_table character, nom character, pk_parent integer)
  RETURNS boolean AS
$BODY$
DECLARE
Bornes RECORD;
BEGIN
EXECUTE 'SELECT ''BordDroite'' INTO Bornes FROM '|| quote_ident (nom_table)||' WHERE id='||pk_parent||';';

EXECUTE 'UPDATE '|| quote_ident (nom_table)||'
SET ''BordDroit'' = ''BordDroit'' + 2 
WHERE ''BordDroit'' >= Bornes;';
 
EXECUTE 'UPDATE '|| quote_ident (nom_table)||'
SET ''BordGauche'' = ''BordGauche'' + 2 
WHERE ''BordGauche'' >= ''Bornes'';';
 
EXECUTE 'INSERT INTO '|| quote_ident (nom_table)||' (''BordDroit'', ''BordGauche'', nom) 
VALUES (Bornes, Bornes+1, '''||nom||''');';
RETURN TRUE;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;

Lorsque je fais :

SELECT ri_ajoute_fils('ri', 'smart', 14);

J'ai le droit à :

ERREUR:  EXECUTE of SELECT ... INTO is not implemented yet
CONTEXTE : PL/pgSQL function "ri_ajoute_fils" line 4 at EXECUTE statement

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

ERREUR: EXECUTE of SELECT ... INTO is not implemented yet
État SQL :0A000
Contexte : PL/pgSQL function "ri_ajoute_fils" line 4 at EXECUTE statement

Qu'est-ce que cela signifie ?

Par avance merci de votre aide

#7 Re : PL/pgSQL » Fonctions variables et arguments » 28/10/2008 21:25:24

CREATE OR REPLACE FUNCTION ri_ajoute_fils(nom_table character, nom character, pk_parent integer)
  RETURNS boolean AS
$BODY$
DECLARE
Bornes RECORD;
BEGIN
EXECUTE 'SELECT BordDroite INTO Bornes FROM '|| quote_indent (nom_table)||' WHERE id=pk_parent;
 
UPDATE '|| quote_indent (nom_table)||'
SET BordDroit = BordDroit + 2 
WHERE BordDroit >= Bornes;
 
UPDATE '|| quote_indent (nom_table)||'
SET BordGauche = BordGauche + 2 
WHERE BordGauche >= Bornes;
 
INSERT INTO '|| quote_indent (nom_table)||' (BordDroit, BordGauche, nom) 
VALUES (Bornes, Bornes+1, '''||nom||''');';
RETURN TRUE;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;
ALTER FUNCTION ri_ajoute_fils(character, character, integer) OWNER TO katagoto;

Ca marche, mais quand j'essaye de l'appeler ça plante, comment faire ?

Par avance merci de votre aide

PS : votre code n'a pas marché hmm

#8 Re : PL/pgSQL » Fonctions variables et arguments » 26/10/2008 20:43:18

gleu a écrit :

Les paramètres de la fonction ne peuvent pas figurer au niveau de la clause FROM. En fait, ils ne sont pas utilisables pour remplacer un nom d'objet (nom de table, nom de colonne, etc.).

Le seul moyen pour faire cela est d'utiliser le langage PL/pgsql.

?

#9 Re : PL/pgSQL » Fonctions variables et arguments » 25/10/2008 11:50:59

Je pense que la casse n'est pas en cause, après la lecture du chapitre sur PL/pgsql j'arrive au code suivant :

CREATE FUNCTION ri_ajoute_fils(IN nomtable character, IN nom character, IN pk_parent integer) RETURNS void AS
$$
DECLARE
Bornes RECORD;
BEGIN
SELECT BordDroite INTO Bornes FROM nomtable WHERE id=pk_parent;

UPDATE nomtable
SET BordDroit = BordDroit + 2
WHERE BordDroit >= Bornes;

UPDATE nomtable
SET BordGauche = BordGauche + 2
WHERE BordGauche >= Bornes;

INSERT INTO nomtable (BordDroit, BordGauche, nom)
VALUES (Bornes, Bornes+1, nom);
END;
$$LANGUAGE 'plpgsql' VOLATILE;

Et donc à l'erreur suivante :

ERREUR:  erreur de syntaxe sur ou près de « $1 »
LIGNE 1 : SELECT BordDroite FROM  $1  WHERE id= $2
                                  ^
REQUÊTE : SELECT BordDroite FROM  $1  WHERE id= $2
CONTEXTE : SQL statement in PL/PgSQL function "ri_ajoute_fils" near line 4


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

ERREUR: erreur de syntaxe sur ou près de « $1 »
État SQL :42601
Contexte : SQL statement in PL/PgSQL function "ri_ajoute_fils" near line 4

Il me semblait que Pl/pgslq permettait les variable à la clause FROM, ai-je mal lu ?

Par avance merci de votre aide

#10 Re : PL/pgSQL » Fonctions variables et arguments » 22/10/2008 14:41:07

Voilà mon nouveau code :
CREATE FUNCTION ri_ajoute_fils(IN nomtable character, IN nom character, IN pk_parent integer) RETURNS void AS
$$
DECLARE
Bornes integer := SELECT BordDroite FROM $1 WHERE id=$3
BEGIN
UPDATE $1
SET BordDroit = BordDroit + 2
WHERE BordDroit >= Bornes;

UPDATE $1
SET BordGauche = BordGauche + 2
WHERE BordGauche >= Bornes;

INSERT INTO $1 (BordDroit, BordGauche, nom)
VALUES (Bornes, Bornes+1, $2);
END;
$$LANGUAGE 'plpgsql' VOLATILE;

Voilà mon nouveau problème :

ERREUR:  erreur de syntaxe sur ou près de « SELECT »
LIGNE 1 : SELECT  SELECT BordDroite FROM  $1  WHERE id= $2  BEGIN UPDA...
                  ^
REQUÊTE : SELECT  SELECT BordDroite FROM  $1  WHERE id= $2  BEGIN UPDATE  $1  SET BordDroit = BordDroit + 2 WHERE BordDroit >= Bornes
CONTEXTE : SQL statement in PL/PgSQL function "ri_ajoute_fils" near line 6

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

ERREUR: erreur de syntaxe sur ou près de « SELECT »
État SQL :42601
Contexte : SQL statement in PL/PgSQL function "ri_ajoute_fils" near line 6

Où est-ce que j'ai planté encore ?

Par avance merci de votre aide

#11 Re : PL/pgSQL » Fonctions variables et arguments » 21/10/2008 18:05:23

Bonjour,

Je ne lâcherais rien, voilà mon code :

CREATE FUNCTION ri_ajoute_fils(IN integer, IN character) RETURNS void AS
$BODY$
UPDATE ri AS A
SET BordDroit = BordDroit + 2
FROM ri AS B
WHERE B.id = $1 AND A.BordDroit >= B.BordDroit;

UPDATE ri AS C
SET BordGauche = BordGauche + 2
FROM ri AS D
WHERE D.id = $1 AND C.BordDroit >= D.BordDroit;

INSERT INTO ri (BordDroite, BordGauche, nom)
VALUES ((SELECT BordDroite FROM ri WHERE id=$1)-2, (SELECT BordGauche FROM ri WHERE id=$1)-1, $2);
$BODY$
LANGUAGE 'sql' VOLATILE;

Ma Table :
-- Table: ri

-- DROP TABLE ri;

CREATE TABLE ri
(
  id serial NOT NULL,
  "BordDroit" integer,
  "BordGauche" integer,
  nom character(64),
  CONSTRAINT ri_pkey PRIMARY KEY (id),
  CONSTRAINT ri_id_key UNIQUE (id)
)
WITH (OIDS=FALSE);
ALTER TABLE ri OWNER TO katagoto;

Mon Erreur :

ERREUR:  la colonne « borddroit » n'existe pas
LIGNE 4 : SET BordDroit = BordDroit + 2
                          ^

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

ERREUR: la colonne « borddroit » n'existe pas
État SQL :42703
Caractère : 112

Comment faire pour que ça marche ?

Par avance merci de votre aide

#12 Général » Valeur par défaut » 21/10/2008 17:04:07

Katagoto
Réponses : 1

Bonjour à toutes et à tous,

J'aimerais savoir s'il serait possible d'indiquer une valeur par défaut "dynamique", en fait, j'ai deux champs (des integer, c1 et c2), et j'aimerais, lors des insertions, que c2 = c1 + 1, pour n'avoir à spécifier que c1,n biensûr, j'aimerais pouvoir modifier c2 à ma guise par la suite...

Comment puis-je réaliser ça ?

Par avance merci de votre aide

#14 Re : PL/pgSQL » Fonctions variables et arguments » 18/10/2008 17:46:10

Ok, il est donc mieu de faire une fonction par table, ce code plante :

CREATE FUNCTION ri_ajoute_fils(IN integer, IN character) RETURNS void AS
$BODY$SELECT * FROM ri AS C WHERE C.id=$1;

UPDATE ri AS A
SET A.BordDroit = A.BordDroit + 2
WHERE A.BordDroit >= C.BordDroit;

UPDATE ri AS B
SET B.BordGauche = B.BordGauche + 2
WHERE B.BordGauche >= C.BordGauche;

INSERT INTO ri (BordDroit, BordGauche, nom) VALUES (C.BordDroit, C.BordDroit+1, $2);$BODY$
LANGUAGE 'sql' VOLATILE;

Erreur :

ERREUR:  la colonne a.borddroit n'existe pas
LIGNE 5 : SET A.BordDroit = A.BordDroit + 2
                            ^

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

ERREUR: la colonne a.borddroit n'existe pas
État SQL :42703
Caractère : 151

Table :
-- Table: ri

-- DROP TABLE ri;

CREATE TABLE ri
(
  id serial NOT NULL,
  "BordDroit" integer,
  "BordGauche" integer,
  nom character(64),
  CONSTRAINT ri_pkey PRIMARY KEY (id)
)
WITH (OIDS=FALSE);
ALTER TABLE ri OWNER TO katagoto;

Je comprend pas d'où ça vient...

Si quelqu'un à une idée...

Par avance merci de votre aide

#15 Re : PL/pgSQL » Fonctions variables et arguments » 18/10/2008 12:00:00

Oui, ça peut servir :


ERREUR:  erreur de syntaxe sur ou près de « $1 »
LIGNE 2 : $BODY$SELECT * FROM $1 AS C WHERE C.pk_categorie=$2;
                              ^

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

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

#16 Re : PL/pgSQL » Fonctions variables et arguments » 18/10/2008 11:23:12

Bon,

J'ai tenté autre chose, quelqu'un peut m'expliquer pourquoi ça plante ?

Par avance merci de votre aide :

CREATE FUNCTION ri_ajoute_fils(IN character, IN integer, IN character) RETURNS void AS
$BODY$SELECT * FROM $1 AS C WHERE C.pk_categorie=$2;

UPDATE $1
SET BordDroit = BordDroit + 2
WHERE BordDroit >= C.BordDroit;

UPDATE $1
SET BordGauche = BordGauche + 2
WHERE B.BordGauche >= C.BordGauche;

INSERT INTO $1 (BordDroit, BordGauche, nom) VALUES (C.BordDroit, C.BordDroit+1, $3);$BODY$
LANGUAGE 'sql' VOLATILE;

#17 PL/pgSQL » Fonctions variables et arguments » 15/10/2008 16:05:11

Katagoto
Réponses : 18

Bonjour à toutes et à tous,

Je suis nouveau, j'ai tenter de crrée une fonction, mais je ne sais pas comment utiliser les arguments :
CREATE FUNCTION ri_ajoute_fils(IN tabletype character, IN pk_parent integer, IN nom character) RETURNS void AS
$BODY$
SELECT * FROM $NomTable AS C WHERE C.pk_categorie=$PkParent;

UPDATE $NomTable
SET BordDroit = BordDroit + 2
WHERE BordDroit >= C.BordDroit;

UPDATE $NomTable
SET BordGauche = BordGauche + 2
WHERE B.BordGauche >= C.BordGauche;

INSERT INTO $NomTable (BordDroit, BordGauche, nom) VALUES (C.BordDroit, C.BordDroit+1, $nom);$BODY$
LANGUAGE 'sql' VOLATILE;

Comment faire ?

Par avance merci de votre aide

PS : J'ai la V8.3.4 de PostGreSQL et j'ai fait cette fonction avec PgAdmin III

Pied de page des forums

Propulsé par FluxBB