Probleme de procédure stocké sous oracle 9i

Fermé
touhami - 22 avril 2008 à 10:24
 monsieur_j - 26 juin 2008 à 16:43
Bonjour,j'ai un probleme lors de l'appel d'une procédure stocké
voici le corp de mon code




/****************corp de procédure**********************/


create or replace procedure recherche_simple_sans_ville
(
titre IN varchar,metier OUT varchar,objectif OUT varchar,region OUT varchar,ville OUT varchar,type_de_contrat OUT varchar,duree OUT varchar,qualification OUT varchar,langue OUT varchar,publication OUT varchar

)
is

BEGIN
SELECT metier,objectif,region,ville,type_de_contrat,duree,qualification,langue,publication INTO metier,objectif,region,ville,type_de_contrat,duree,qualification,langue,publication FROM touhami.cv
WHERE metier LIKE titre ;
end;

/**************code asp.net(vb.net) appel de procédure*********/



Dim MaChaineDeConnection As String = "provider = MSDAORA ; data source = recrut;User ID=touhami;Password=glmaster;Unicode=True"


Dim MaConnexion As New OleDbConnection(MaChaineDeConnection)

Dim MaRequete As String = "recherche_simple_sans_ville"

Dim MaCommande As New OleDbCommand(MaRequete, MaConnexion)
MaCommande.CommandType = CommandType.StoredProcedure


Dim MonParametre, MonParametre1, MonParametre9, MonParametre2, MonParametre3, MonParametre4, MonParametre5, MonParametre6, MonParametre7, MonParametre8 As OleDbParameter
MonParametre = MaCommande.Parameters.Add("titre" , OleDbType.VarChar, 100)
MonParametre.Value ="%" & titre.Text & "%"
MonParametre9 = MaCommande.Parameters.Add("metier" , OleDbType.VarChar, 20)
MonParametre9.Direction = ParameterDirection.Output

MonParametre1 = MaCommande.Parameters.Add("objectif" , OleDbType.VarChar, 20)
MonParametre1.Direction = ParameterDirection.Output

MonParametre2 = MaCommande.Parameters.Add("region" , OleDbType.VarChar, 20)
MonParametre2.Direction = ParameterDirection.Output

MonParametre3 = MaCommande.Parameters.Add("ville" , OleDbType.VarChar, 20)
MonParametre3.Direction = ParameterDirection.Output

MonParametre4 = MaCommande.Parameters.Add("tupe_de_contrat" , OleDbType.VarChar, 20)
MonParametre4.Direction = ParameterDirection.Output

MonParametre5 = MaCommande.Parameters.Add("duree" , OleDbType.VarChar, 20)
MonParametre5.Direction = ParameterDirection.Output

MonParametre6 = MaCommande.Parameters.Add("qualification" , OleDbType.VarChar, 20)
MonParametre6.Direction = ParameterDirection.Output

MonParametre7 = MaCommande.Parameters.Add("langue" , OleDbType.VarChar, 20)
MonParametre7.Direction = ParameterDirection.Output

MonParametre8 = MaCommande.Parameters.Add("publication" , OleDbType.VarChar, 20)
MonParametre8.Direction = ParameterDirection.Output


MaConnexion.Open()


Dim myReader As OleDbDataReader = MaCommande.ExecuteReader()



lorsque jai un seul enregistrement dans la table CV pas de probleme mais quand je possede plusieur enregistrement voici le message d'erreur qui s'affiche:
ORA-01422: l'extraction exacte ramène plus que le nombre de lignes demandé
ORA-06512: à "TOUHAMI.RECHERCHE_SIMPLE_SANS_VILLE", ligne 9
ORA-06512: à ligne 1

3 réponses

UaLShark Messages postés 191 Date d'inscription vendredi 19 mai 2006 Statut Membre Dernière intervention 21 juillet 2010 35
22 avril 2008 à 10:35
bonjour touhami,
ora-01422 : Exact fetch return more than one row
c'est pas une exception applicative c'une exception oracle
ça veut dire que ton critére d selection retourne plus q'un enregistrement (un curseur cad)
vérifie que les critère passés en paramètre à la procédure sont éliminatoires (au max 1 ligne de retour)
sinon tu peux m'envoyer le script create table ?
0
Bonjour,

2 solutions au problème indiqué:

soit tu gères l'EXCEPTION oracle dans ta procédure,
soit tu gères cette exception dans ton programme.

Le plus propre est de gérer cela au niveau de la procédure de la sorte:

create or replace procedure recherche_simple_sans_ville (
titre IN varchar,
metier OUT varchar,
objectif OUT varchar,
region OUT varchar,
ville OUT varchar,
type_de_contrat OUT varchar,
duree OUT varchar,
qualification OUT varchar,
langue OUT varchar,
publication OUT varchar,
MESSAGE_ERREUR OUT VARCHAR,
) is
BEGIN
MESSAGE_ERREUR := '' ;
SELECT metier,objectif,region,ville,type_de_contrat,duree,qualification,langue,publication
INTO metier,objectif,region,ville,type_de_contrat,duree,qualification,langue,publication
FROM touhami.cv
WHERE metier LIKE titre ;
exception
WHEN TOO_MANY_ROWS THEN MESSAGE_ERREUR := 'ERREUR: la requête retourne trop d''enregistrements' ;
WHEN NO_DATA_FOUND THEN MESSAGE_ERREUR := 'ERREUR: la requête ne retourne aucune enregistrement' ;
end;

Ensuite, tu peux tester dans ton programme si le champ (MESSAGE_ERREUR <> '') est traité les différents cas.

Sinon, je pense qu'en fait, tu voudrais créer un procédure qui retourne un curseur afin de faire des lectures sucessives ... dans ce cas, tu peux consulter cet article <http://msdn.microsoft.com/fr-fr/library/4s2zbbsz(VS.80).aspx> (cet exemple est plus ou moins bien réalisé mais l'idée est présente).

Bonne continuation.
0
Rectification concernant le lien qui est le suivant <http://msdn.microsoft.com/fr-fr/library/4s2zbbsz(VS.80).aspx>

Bon usage.
0