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.
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;
/
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
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
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
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 Try
L'exception ramène le message :
Correspondance de types personnalisés pour 'BaseOracle.clsTest' non spécifiée ou non valide.
Je ne comprends pas.
Pouvez-vous m'aider ?
Merci.