PostgreSQL
La base de données la plus sophistiquée au monde.

Ouverture de session

Navigation

Contactez-nous

Administration du site :
"equipe chez postgresqlfr point org"

Contact presse :
"fr chez postgresql point org"

Contact association :
"bureau chez postgresqlfr point org"

Questions PostgreSQL :
 IRC :
  serveur irc.freenode.net
  canal #postgresqlfr

Recherche

Accéder aux archives

« Octobre 2008  
Lun Mar Mer Jeu Ven Sam Dim
  2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31  

Syndication

Flux XML

Sondage

Quelle est la version de PostgreSQL la plus répandue sur vos serveurs ?
8.3
10%
8.2
42%
8.1
40%
8.0
2%
7.4
6%
7.3 ou antérieure
0%
Nombre de votes: 48

PLPGSQL : Nom des tables en variable possible ?

Technique - Langages Procéduraux (PL) | PLPGSQL : Nom des tables en variable possible ?

Par jonathan.dupre le 29/04/2008 - 10:37

Bonjour, voila je bloque sur une fonction un peu con.
Je pense que vous la comprendrez facilement: le but est de trouver dans quelle sous-table appartient un ID (clé primaire), car j'ai un héritage... Donc dans une fonction je parcours les tables possible mais visiblement je ne peux pas faire d'appel sur une table si c'est un nom de variable :

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

CREATE OR REPLACE FUNCTION get_type_of_document(bigint) RETURNS varchar AS '
/* Le but de cette fonction est de déterminer dans quelle table si situe un document */
/* Selon la table */
DECLARE
document_id ALIAS FOR $1;
test_exist_value BIGINT;
document_table VARCHAR :='''';
my_tables VARCHAR[];
temp_table_array VARCHAR;
my_compter INTEGER;
BEGIN
/* On cherche dans les différentes tables listées dans le tableau....*/
my_tables[1] := ''doc_admin'';
my_tables[2] := ''doc_audio'';
my_tables[3] := ''doc_contr_cession'';
my_tables[4] := ''doc_contr_trav'';
my_tables[5] := ''doc_doss_presse'';
my_tables[6] := ''doc_fich_tec'';
my_tables[7] := ''doc_photo'';
my_tables[8] := ''doc_video'';

FOR my_compter IN 1 .. 8 LOOP
temp_table_array := my_tables[my_compter];

SELECT COUNT(id_doc) INTO test_exist_value
FROM temp_table_array D
WHERE D.id_doc = document_id;

IF test_exist_value = 1 THEN
document_table := temp_table_array;
EXIT;
END IF;
END LOOP;
RETURN document_table;
END'
LANGUAGE 'plpgsql';

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

Visiblement il n'aime pas le "FROM temp_table_array" / "FROM une_variable" quoi .... (Erreur de syntaxe près de ...)
Si je met un nom de table bidon (qui n'est pas une variable) çà marche !

Je comprends pas que l'on ne puisse pas donner une variable comme nom de table, est-ce que j'oublie quelque chose ?

Merci de m'Ă©clairer.

Jonathan

Options d'affichage des commentaires

Sélectionnez la méthode d'affichage des commentaires que vous préférez, puis cliquez sur "Sauvegarder les paramètres" pour activer vos changements.

J'ai trouvé mieux

jonathan.dupre/ = 29 Avril, 2008 - 11:32

Bon laissez tomber, j'ai trouvé (carérment) mieux et optimisé :

CREATE OR REPLACE FUNCTION get_type_of_document(bigint) RETURNS varchar AS '
DECLARE
document_id ALIAS FOR $1;
document_table VARCHAR;
BEGIN

SELECT pg_class.relname AS "type" INTO document_table
FROM document, pg_class
WHERE document.id_doc = document_id
AND document.tableoid = pg_class.oid;
RETURN document_table;
END'
LANGUAGE 'plpgsql';

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

les sources des solutions :

Pour l'héritage : http://geekblog.over-blog.com/article-17775481.html
Pour le problème des variables dynamiques :
http://docs.postgresqlfr.org/8.3/plpgsql-statements.html#plpgsql-statements-executing-dyn

Désolé du dérangement....


Bonjour...

Jean-Paul Argudo/ = 29 Avril, 2008 - 14:20

Je n'ai pas trop compris l'intérêt de votre fonction... S'il s'agit de requêter la bonne sous-table, PostgreSQL sait le faire tout seul si vous avez eu la bonne idée, en plus de l'héritage, de faire du partitionnement, et d'utiliser la clé de partitionnement dans la clause WHERE de votre requête...

Si tel Ă©tait le cas, n'oubliez pas d'activer le constraint_exclusion dans votre postgresql.conf.

Cordialement,

--
Jean-Paul ARGUDO
http://dalibo.com | http://dalibo.org


Bonjour...

jonathan.dupre/ = 30 Avril, 2008 - 11:48

Non je n'ai pas fait de partitionnement.
En fait j'ai une table document avec comme identifiant un serial (id_doc).
Puis j'ai des sous-tables qui héritent de la table "document" qui sont: "doc_admin", "doc_audio", "doc_video","doc_autre", etc...

Or je voulais savoir a quel "type" ou "sous-table" appartenait tel ID :

ID (document.id_doc) / Type
1 doc_admin
2 doc_audio
3 doc_audio
4 doc_video
5 doc_autre

Voila, c'était çà.


© PostgreSQLFr, tous droits rĂ©servĂ©s.
Site déclaré à la CNIL sous le numéro 1074678, conformément à la Loi en vigueur.