Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
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 21/06/2008, 21h35   #1
Invité de passage
 
Inscription : mai 2008
Messages : 21
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 21
Points : 1
Points : 1
Par défaut Validation paramètres PL/SQL : Comment ?

Bonsoir,

J'ai une petite question sur la meilleure façon de valider des paramètres d'une procédure en PL SQL.

j'ai une fonction qui reçoit un paramètre dont voici un exemple de signature:

Code :
1
2
3
 
 
FUNCTION augmenterTaille(inCode IN VARCHAR2) RETURN NUMBER
J'aimerai dans le body de ma fonction tester que le paramètre inCode est bien dans une table de dictionnaire.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
 
FUNCTION augmenterTaille(inCode IN VARCHAR2) RETURN NUMBER 
IS 
BEGIN
  BEGIN
   trouver le inCode dans le dictionnaire des taille  
  EXCEPTION 
     when NO_DATA_FOUND 
         raise_application_error(-20001, 'Le code ' || inCode || 'n''existe pas';
  END;
  suite de la FUNCTION.
END augmenterTaille;
Le problème c'est que j'ai énormément de fonction dans le genre et j'aimerais avoir un truc un peu plus générique.
Est-ce que quelqu'un pourrait m'expliquer comment je peux faire pour valider de manière simple et pratique des paramètres de procédure/function en plsql?
merci d'avance.
central.jaco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2008, 10h16   #2
Invité de passage
 
Inscription : mai 2008
Messages : 21
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 21
Points : 1
Points : 1
Si c'est plus facile, comment je peux faire un

Code :
1
2
3
4
 
IF inVALUE NOT IN (SELECT A.CODE FROM DICTIONNAIRE ) THEN
   raise_application_error(...);
END IF;
Merci par avance
central.jaco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2008, 22h29   #3
Membre habitué
 
Inscription : février 2006
Messages : 139
Détails du profil
Informations personnelles :
Âge : 37
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : février 2006
Messages : 139
Points : 126
Points : 126
bonsoir,

Je ne comprends pas bien ton probleme.
pourquoi ne pas faire une fonction qui s'occupe de cette tache alors?

Code :
1
2
3
4
5
6
7
FUNCTION isValid(p1 IN varchar2) RETURN BOOLEAN IS
begin
   recherche code;
   RETURN true;
exception when no_data_found then
  RETURN false ; -- ou raise
end;
Code :
1
2
3
4
5
IF isValid(incode) then
   --traitement
else
  raise_application_error;
end IF;
Remarque: si ton dictionnaire contient peu de valeurs, tu peux travailler avec une collection, chargee une fois, pour economiser la requete SQL.
kervoaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2008, 17h41   #4
Invité de passage
 
Inscription : mai 2008
Messages : 21
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 21
Points : 1
Points : 1
Merci pour ta réponse. Je l'ai fais maintenant avec une fonction qui retourne un boolean, mais je pensais que c'etait possible sans devoir parcourir moi même le CURSOR.

Un truc comme
Code :
1
2
 
IF 'XX' NOT IN (SELECT FOO FROM BAR);
Sinon, dans les collection d'ORACLE, est-ce qu'il existe un truc comme le Map<K,V> de java (TreeMap, HashMap...)?

Merci
central.jaco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2008, 21h52   #5
Membre habitué
 
Inscription : février 2006
Messages : 139
Détails du profil
Informations personnelles :
Âge : 37
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : février 2006
Messages : 139
Points : 126
Points : 126
bonsoir,
les collections Oracle sont moins raffinées que celle de java encore que...
http://sheikyerbouti.developpez.com/pl_sql/

tu peux faire un tableau de record(K,V) pour simuler une hashmap. Mais selon ta key, il faudra surement faire une boucle pour retrouver le bon record.

Cdt
kervoaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 17h44   #6
Membre habitué
 
Inscription : février 2006
Messages : 139
Détails du profil
Informations personnelles :
Âge : 37
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : février 2006
Messages : 139
Points : 126
Points : 126
une pseudo simulation d'une hashmap:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
declare
HMvalue  varchar2(200);
HMkey  varchar2(10);
type hashmap IS TABLE of varchar2(200) INDEX BY varchar2(10);
 
mamap hashmap;
 
begin
    HMkey:='key1';
    HMvalue:='value1';
    mamap(HMkey):=HMvalue;
    HMkey:='key2';
    HMvalue:='value2';
    mamap(HMkey):=HMvalue;
 
 
    dbms_output.put_line(mamap('key1'));
    dbms_output.put_line(mamap('key2'));
end;
kervoaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 21h36   #7
Invité de passage
 
Inscription : mai 2008
Messages : 21
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 21
Points : 1
Points : 1
C'est parfait!!
Je connaissais pas!
Très grand merci à toi et excellente soirée!
central.jaco est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h05.


 
 
 
 
Partenaires

Hébergement Web