Bonjour,
Comme dit dans l'intitulé, je voudrais lancer une procédure stockée sous Oracle avec un paramètre en entrée qui est un Object Type défini sous Oracle.
J'ai cherché des infos et tutos sur le net et je me suis créé un exemple basique pour comprendre le mécanisme.
Voici le code Oracle volontairement très simple.
Voici la classe que j'ai implémenté dans VB 2012 pour gérer le mapping avec l'Object Type d'Oracle
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 create or replace TYPE zzz_obj_ville AS OBJECT ( code_postal varchar2(5)) not final; / create Table zzz_tab_ville ( code_postal varchar2(5)); / create or replace procedure zzz_procedure ( pin_ville in zzz_obj_ville ) is begin insert into zzz_tab_ville values ( pin_ville.code_postal); commit; end; /
Et voici le code qui fait l'appel (version light sans par exemple la connexion)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 Imports Oracle.DataAccess.Client Imports Oracle.DataAccess.Types Public Class clsTest Implements IOracleCustomType Private m_CodePostal As String <OracleObjectMappingAttribute("CODE_POSTAL")> _ Public Overridable Property CodePostal() As String Get Return m_CodePostal End Get Set(value As String) m_CodePostal = value End Set End Property Public Sub FromCustomObject(con As OracleConnection, pUdt As IntPtr) Implements IOracleCustomType.FromCustomObject OracleUdt.SetValue(con, pUdt, "CODE_POSTAL", Me.CodePostal) End Sub Public Sub ToCustomObject(con As OracleConnection, pUdt As IntPtr) Implements IOracleCustomType.ToCustomObject 'The ToCustomObject method is used to initialize a custom object from the 'specified Oracle 'Object or Collection by retrieving attribute or element values 'respectively through the OracleUdt.GetValue method. Me.CodePostal = OracleUdt.GetValue(con, pUdt, "CODE_POSTAL").ToString End Sub End Class
L'exception ramène le message :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 Dim MonTest As New clsTest MonTest.CodePostal = "75001" ' On définit la procédure à lancer Dim cmdProcedure As OracleCommand = New OracleCommand Try With cmdProcedure .Connection = Me.Connexion .CommandType = CommandType.StoredProcedure .CommandText = "scott.zzz_procedure" Dim param As OracleParameter = New OracleParameter param.OracleDbType = OracleDbType.Object param.Direction = ParameterDirection.Input ' Note: The UdtTypeName is case-senstive param.UdtTypeName = "SCOOTT.ZZZ_OBJ_VILLE" param.Value = MonTest cmdProcedure.Parameters.Add(param) End With ' Exécution de la procédure cmdProcedure.ExecuteNonQuery() Catch ex As Exception Throw End TryJe ne comprends pas.Correspondance de types personnalisés pour 'BaseOracle.clsTest' non spécifiée ou non valide.
Pouvez-vous m'aider ?
Merci.
Partager