Probleme de procédure stocké sous oracle 9i
touhami
-
monsieur_j -
monsieur_j -
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
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
A voir également:
- Ora-01422: l'extraction exacte ramène plus que le nombre de lignes demandé
- Où est stocké le presse-papier - Guide
- Où sont stockés les mots de passe sur android - Guide
- Lenovo yoga 9i - Accueil - Ordinateurs
- Oracle liste des tables ✓ - Forum Oracle
- Procédure de frigo vide ✓ - Forum Consommation & Internet
3 réponses
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 ?
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 ?
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.
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.