[POSTGRESQL] Fct plpgsql - Nom de champ modifiable, marche pas. pq? :(

Fct plpgsql - Nom de champ modifiable, marche pas. pq? :( [POSTGRESQL] - SQL/NoSQL - Programmation

Marsh Posté le 27-09-2005 à 20:46:20    

Salut
 
j'essaie de creer une fonction pour me faciliter la vie en pl/pgsql.
En fait cette fonction recoit un identifiant d'une table quelconque (type integer), et un nom de table (varchar).
Cette fonction teste si l'id donné existe dans la table donnée.
 
Pour ce faire il faut recuperer le nom du champ qui est une clé primaire. Jusque la pas de problème. Mais ca se corse lorsque je veux insérer ce nom de champ qui est VARIABLE dans la requete suivante. Ca passe pas.
 
Voila la définition de ma fonction :  

Code :
  1. /*
  2. Verifie l'existence de la clé primaire passée en argument pour la table donnée
  3. */
  4. DECLARE
  5. v_id alias for $1;
  6. v_table alias for $2;
  7. v_enr record;
  8. v_enr2 record;
  9. BEGIN
  10. -- Retourne le nom de la clé primaire de la table
  11. SELECT
  12.  SUBSTR(
  13.   indexdef,
  14.   STRPOS(indexdef, '(')+1,
  15.   STRPOS(indexdef, ')') - STRPOS(indexdef, '(')-1
  16.    ) AS nom_cle
  17.    INTO v_enr
  18. FROM
  19.  pg_indexes
  20. WHERE
  21.  tablename=v_table AND
  22.  SUBSTR(indexdef, 8, 6)='UNIQUE';
  23. -- Traitement
  24. IF LENGTH(v_enr.nom_cle) > 0 THEN
  25.  -- index trouvé, on vérifie que l'id existe dans la table
  26.  SELECT COUNT(*) AS nb INTO v_enr2 FROM v_table WHERE v_enr.nom_cle=v_id;
  27.  IF LENGTH(v_enr2.nb) > 0 THEN
  28.   -- id trouvé
  29.   RETURN TRUE;
  30.  ELSE
  31.   -- id non trouvé
  32.   RETURN FALSE;
  33.  END IF;
  34. ELSE
  35.  -- index non-trouvé
  36.  RETURN FALSE;
  37. END IF;
  38. END;


 
 
Ca merde a la ligne 31 :  
 
SELECT COUNT(*) AS nb INTO v_enr2 FROM v_table WHERE v_enr.nom_cle=v_id;
 
Ce qui est en gras ne passe pas.
 
Alors ma question est :
 
Comment faire pour rendre cette requête valide ? Il faudrait juste que "v_enr.nom_cle" soit interprété comme une partie de la requete...
Mais apres des heures de recherche je ne trouve pas :(
 
J'espère que c'est possible...
 
Merci d'avance  :)


---------------
Recherche de partenaires pvp dans World of Warcraft :: http://www.wowteamfinder.com
Reply

Marsh Posté le 27-09-2005 à 20:46:20   

Reply

Marsh Posté le 27-09-2005 à 21:23:36    

Bon ben j'ai fini par trouver tout seul, vive moi :D

Code :
  1. /*
  2. Verifie l'existence de la clé primaire passée en argument pour la table donnée
  3. */
  4. DECLARE
  5. v_id alias for $1;
  6. v_table alias for $2;
  7. curseur refcursor;
  8. v_enr record;
  9. v_enr2 record;
  10. v_nom_index varchar;
  11. BEGIN
  12. -- Retourne le nom de la clé primaire de la table
  13. SELECT
  14.  SUBSTR(
  15.   indexdef,
  16.   STRPOS(indexdef, '(')+1,
  17.   STRPOS(indexdef, ')') - STRPOS(indexdef, '(')-1
  18.    ) AS nom_cle
  19.    INTO v_enr
  20. FROM
  21.  pg_indexes
  22. WHERE
  23.  tablename=v_table AND
  24.  SUBSTR(indexdef, 8, 6)='UNIQUE';
  25. v_nom_index=v_enr.nom_cle;
  26. -- Traitement
  27. IF LENGTH(v_enr.nom_cle) > 0 THEN
  28.  -- index trouvé, on vérifie que l'id existe dans la table
  29.   OPEN curseur FOR EXECUTE
  30.    'SELECT COUNT(*) AS nb FROM ' ||
  31.    quote_ident(v_table) ||
  32.   ' WHERE ' ||
  33.   quote_ident(v_nom_index) ||
  34.   ' = ' || quote_literal(v_id);
  35.  FETCH curseur INTO v_enr2;
  36.  IF v_enr2.nb > 0 THEN
  37.   -- id trouvé
  38.   RETURN TRUE;
  39.  ELSE
  40.   -- id non trouvé
  41.   RETURN FALSE;
  42.  END IF;
  43. ELSE
  44.  -- index non-trouvé
  45.  RETURN FALSE;
  46. END IF;
  47. END;


---------------
Recherche de partenaires pvp dans World of Warcraft :: http://www.wowteamfinder.com
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed