Appel d'une fonction qui retourne un 'record' (Oracle 9i) dans un code VB.net

cs_TIKATKT Messages postés 40 Date d'inscription mardi 16 février 2010 Statut Membre Dernière intervention 6 février 2012 - 30 mars 2010 à 18:28
cs_TIKATKT Messages postés 40 Date d'inscription mardi 16 février 2010 Statut Membre Dernière intervention 6 février 2012 - 6 avril 2010 à 12:43
Bonjour,
je travaille sur une application codée en vb.net et connectée à une base de données oracle 9i.
Dans la BD j'ai créé une procédure qui retourne une variable de type varchar2:

CREATE OR REPLACE PROCEDURE SYSTEM.Proc1( p1 in varchar, n2 out varchar ) .....

l'appel de cette procédure dans le projet VB.net ce fait comme suit:

dim n1 As String

With CmdOracle
.CommandText = "Proc1"
.CommandType = CommandType.StoredProcedure
.Connection = ConOracle
.Connection.Open()
.Parameters.Clear()
.Parameters.Add("p1", OracleType.VarChar, 20).Value = Matricule
.Parameters.Add("n2", OracleType.VarChar, 20).Direction = ParameterDirection.Output
.ExecuteNonQuery()

n1 = .Parameters("n2").Value

End With

dans ce cas la variable n1 prend bien la valeur de retour de la procédure (n2).

Maintenant, je veux faire l'appel d'une fonction nommée (Fun1) du package suivant:

CREATE OR REPLACE PACKAGE SYSTEM.PKG1 AS
...
...
FUNCTION Fun1 (NUM1 IN VARCHAR2) RETURN INFO1;
FUNCTION Fun2 (NUM1 IN VARCHAR2) RETURN INFO2;
...
END

Le retour de cette fonction (INFO1) est de type "record".


Là je me bloque au niveau appel de la fonction dans le code vb.net.

Avez-vous une idée ?

Merci d'avance.

2 réponses

cs_TIKATKT Messages postés 40 Date d'inscription mardi 16 février 2010 Statut Membre Dernière intervention 6 février 2012
30 mars 2010 à 20:33
Rebonjour,

Le problème je l'ai à ce niveau:
...
.CommandText = "MonPackage.MaFonction"
.CommandType = CommandType.StoredProcedure
...

à l'exécution ça me donne l'erreur suivante:

ORA-06550: Ligne 1, colonne 7 :
PLS-00221: 'MaFonction' n'est pas une procédure ou est indéfini
ORA-06550: Ligne 1, colonne 7 :
PL/SQL: Statement ignored

Merci d'avance et bonne soirée !
0
cs_TIKATKT Messages postés 40 Date d'inscription mardi 16 février 2010 Statut Membre Dernière intervention 6 février 2012
6 avril 2010 à 12:43
D'après les recherches que j'ai faites,j'ai déduit que c'est pratiquement infaisable pour ce genre de fonction qui retourne un type complexe dans mon cas 'record.

Alors là j'ai enfin changé la méthode que j'ai utilisée et j'ai créé des procédures qui ont des paramètres simples en sortie, ces paramètres je les ai rempli des valeurs retourner dans le record de la fonction du départ. et ça marche

Petit exemple:
Le Package :
CREATE OR REPLACE PACKAGE Pack1 AS
TYPE INFO1 IS RECORD (
Param1 VARCHAR2(9),
Param2 VARCHAR2(12));
--
FUNCTION Fun1(ParamF1 IN VARCHAR2) RETURN INFO1;
END Pack1;
/

La procédure:
CREATE OR REPLACE PROCEDURE GetInfo1 ( ParamP1 in varchar,
A out varchar2,
B out varchar2) IS
R Pack1.INFO1;
BEGIN

R:= Pack1.Fun1(ParamP1);

A := R.Param1;
B := R.Param2;
END;
/


Mais il me reste encore un petit problème concernant les fonctions qui retourne 'un tableau de record'
J'arrive pas à créer la procédure convenable

Voici le code de l'entête du package:

CREATE OR REPLACE PACKAGE Pack1 AS
TYPE INFO1 IS RECORD (
Param1 VARCHAR2(9),
Param2 VARCHAR2(12));
TYPE INFOS IS TABLE OF INFO1 INDEX BY BINARY_INTEGER;
--
FUNCTION Fun1(ParamF1 IN VARCHAR2) RETURN INFOS;
END Pack1;
/

Merci d'avance pour vos réponses
0
Rejoignez-nous