Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/03/2005, 18h40   #1
Membre habitué
 
Inscription : mai 2002
Messages : 131
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 131
Points : 142
Points : 142
Par défaut [Syntaxe SQL]Un équivalent de "IF EXISTS" ?

Bonsoir à tous,

Dans un script de création de base pour PostgreSQL, je souhaite, avant de lancer les commande create table, supprimer ces dernières uniquement si elles existent déjà. Je pensais pour cela m'aider d'une requête sur la table système pg_class, tout ceci dans un bloc conditionnel. Dans certains SGBD, il est possible d'utiliser la syntaxe suivante :

Code :
1
2
3
IF EXISTS (predicat) THEN
     (commande)
 END IF
Malheureusement, pour PostgreSQL, je n'ai rien trouvé de tel. Est-ce qu'il existe un équivalent à cette syntaxe ?

Merci d'avance
Quentin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2005, 14h32   #2
Membre à l'essai
 
Inscription : janvier 2005
Messages : 38
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : janvier 2005
Messages : 38
Points : 24
Points : 24
Envoyer un message via MSN à moog
Bonjour,
pour ce qui est des fonctions tu peux ecrire

Code :
1
2
3
CREATE OR REPLACE FUNCTION mafonction(...)
...
END;
Par contre, cette syntaxet ne marche pas pour la création de tables...
c'est tout ce que je sais
moog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2005, 15h01   #3
Membre du Club
 
Inscription : mars 2005
Messages : 45
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 45
Points : 42
Points : 42
le booléen FOUND est positionné après chaque requête si le nombre de lignes affectées est non nul. Par contre il faut passer par une fonction trouvée là :
http://archives.postgresql.org/pgsql...3/msg00125.php

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE OR REPLACE FUNCTION drop_table_if_exists(text, bool) RETURNS bool AS '
DECLARE
opt text;
rec record;
BEGIN
IF $2 THEN
opt := '' CASCADE'';
ELSE
opt := '''';
END IF;
 
SELECT INTO rec oid FROM pg_class WHERE relname = $1::name;
  IF FOUND THEN
    EXECUTE ''DROP TABLE '' || $1 || opt;
    RETURN true;
  END IF;
  RETURN false;
END;
' LANGUAGE 'plpgsql';
edelatte est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2005, 18h09   #4
Membre habitué
 
Inscription : mai 2002
Messages : 131
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 131
Points : 142
Points : 142
Citation:
Envoyé par moog
Bonjour,
pour ce qui est des fonctions tu peux ecrire

Code :
1
2
3
CREATE OR REPLACE FUNCTION mafonction(...)
...
END;
Par contre, cette syntaxet ne marche pas pour la création de tables...
c'est tout ce que je sais
Je sais bien et c'est justement ce qui m'embêtait. Merci de ta réponse, en tout cas.

Citation:
Envoyé par edelatte
le booléen FOUND est positionné après chaque requête si le nombre de lignes affectées est non nul. Par contre il faut passer par une fonction trouvée là :
http://archives.postgresql.org/pgsql...3/msg00125.php
J'en suis arrivé à la même conclusion : passer par une procédure stockée. En tout cas, merci pour le lien et le code. Même s'il est "very lightly tested", ça me fera économiser quelques minutes de recherche dans la doc sur les tables système
Quentin est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h37.


 
 
 
 
Partenaires

Hébergement Web