Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1822 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1209171
Gat$
http://www.wowteamfinder.com
Posté le 27-09-2005 à 20:46:20  profilanswer
 

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
mood
Publicité
Posté le 27-09-2005 à 20:46:20  profilanswer
 

n°1209203
Gat$
http://www.wowteamfinder.com
Posté le 27-09-2005 à 21:23:36  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

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

 

Sujets relatifs
changement de nom de domaine et mon script marche plus..[SQL Server] Tester si un champ = 0 dans clause SELECT
Acceder à un champ d'un curseur[PostgreSQL] Alias de table et performance
Champ texte avec mise en formeCréer un champ de saisie formulaire dans une page web (newbie) ?
Champ non modifiable[RESOLU] Problème avec XmlHttpRequest : marche pas sous IE
Récupérer le type d'un champ 
Plus de sujets relatifs à : [POSTGRESQL] Fct plpgsql - Nom de champ modifiable, marche pas. pq? :(


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR