Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL > Débuter
Débuter Forum d'entraide : Débuter en base de données avec 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 26/05/2011, 17h37   #1
Invité de passage
 
Inscription : juillet 2010
Messages : 8
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 8
Points : 0
Points : 0
Par défaut Création d'une fonction [debutant]

Bonjour,

Je vous expose tout d'abord la base de données:

Elle est composée de plusieurs "schémas", une public (principal) et plusieurs autres qui peuvent variées.

Tous les schémas sont structurées de la même manière ainsi il y a les mêmes tables dans le schéma "public" et le schéma "x". Bien-sûr les clés primaires ne sont jamais les mêmes...

Le problème : j'aimerais créer une fonction qui insérera les données du schéma x vers le schéma public (principal)

J'ai essayé de créer une fonction, mais bien-sûr, débutant comme je suis, je ne sais même pas si je m'y prend bien.


Code sql :
1
2
3
4
5
CREATE FUNCTION copydata(lenomduschema varchar) RETURNS varchar AS $$
BEGIN
     INSERT INTO public.tablex SELECT * FROM lenomduschema.tablex;
END;
$$ LANGUAGE PLPGSQL;

Cette fonction se crée sans problème mais à l’exécution, "lenomduschema" n'est pas considérée comme une variable mais comme un schéma qui s'appel "lenomduschema".

Merci beaucoup de pouvoir m'aider.

KiAhS
KiAhS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 19h17   #2
Modérateur
 
Inscription : octobre 2008
Messages : 1 507
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 507
Points : 2 037
Points : 2 037
C'est du SQL dynamique, c.a.d qu'il faut considérer la requête SQL comme une chaine de caractères qu'on construit et la lancer avec la fonction EXECUTE de plpgsql.
Par ailleurs il ne faut pas déclarer la fonction en RETURNS varchar si elle ne retourne rien, mais plutôt en RETURNS void
estofilo est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 19h40   #3
Invité de passage
 
Inscription : juillet 2010
Messages : 8
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 8
Points : 0
Points : 0
Merci pour ta réponse, mais je ne comprend pas comment considérer la requête SQL comme une chaîne de caractères.
J'ai essayé ça mais sans succès


Code sql :
1
2
3
4
5
6
7
8
CREATE OR REPLACE FUNCTION test(lenomduschema VARCHAR) returns void AS $$
declare
	toto VARCHAR;
begin
	toto = 'insert into public.tablex SELECT * FROM ' + lenomduschema + '.tablex;';
EXECUTE toto;
end ; 
$$ LANGUAGE plpgsql;

Je n'arrive pas à Comprendre comment ça marche,
Si quelqu'un pourrai m'éclairer...

Merci
KiAhS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 19h46   #4
Invité de passage
 
Inscription : juillet 2010
Messages : 8
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 8
Points : 0
Points : 0
Ca y est, merci de ton aide...

voila le code :

Code sql :
1
2
3
4
5
6
7
8
CREATE OR REPLACE FUNCTION test(lenomduschema VARCHAR) returns void AS $$
declare
	toto VARCHAR;
begin
	toto = 'insert into public.tablexSELECT * FROM ' || lenomduschema ||'.tablex;';
EXECUTE toto;
end ; 
$$ LANGUAGE plpgsql

Sympa, pour la réponse rapide ...

++
KiAhS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 22h07   #5
Modérateur
 
Inscription : octobre 2008
Messages : 1 507
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 507
Points : 2 037
Points : 2 037
Juste une remarque: il est préférable de manière générale de faire quote_ident(nomduschema) au lieu de simplement nomduschema. Sinon la requête partira en erreur si le nom de schéma contient des caractères non alphanumériques ou accentués.
C'est vrai aussi pour les noms de colonnes ou les noms de table.
estofilo est actuellement 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 16h55.


 
 
 
 
Partenaires

Hébergement Web