Lancer une procédure Oracle avec un Object Type en paramètre
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:
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:
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:
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 :
Citation:
Correspondance de types personnalisés pour 'BaseOracle.clsTest' non spécifiée ou non valide.
Je ne comprends pas.
Pouvez-vous m'aider ?
Merci.