IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Lancer une procédure Oracle avec un Object Type en paramètre [Débutant]


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Par défaut 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 : 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.

  2. #2
    Membre éclairé
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Par défaut
    Finalement, j'ai réussi à réaliser mon exemple, et même avec 2 propriétés dans l'Object Type.
    En fait, il manquait une classe implémentant IOracleCustomTypeFactory. Et j'ai ajouté la gestion de NULL

    Si ça intéresse quelqu'un, voici le code complet qui marche.
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    ORACLE :
    create or replace TYPE zzz_obj_ville AS OBJECT ( code_postal varchar2(5), ville varchar2(200)) not final;
    create Table zzz_tab_ville ( code_postal varchar2(5), ville varchar2(200));
    create or replace procedure zzz_procedure ( pin_ville in zzz_obj_ville )
    is
    begin
       insert into zzz_tab_ville values ( pin_ville.code_postal, pin_ville.ville);
       commit;
    end;
     
    *******************************************************************
    VB.NET:
     
    Imports Oracle.DataAccess.Client
    Imports Oracle.DataAccess.Types
     
    Public Class clsTest
        Implements IOracleCustomType, INullable
     
        Private m_IsNull As Boolean
        Private m_CodePostal As OracleString
        Private m_Ville As String
     
        <OracleObjectMappingAttribute("CODE_POSTAL")> _
        Public Overridable Property CodePostal() As OracleString
            Get
                Return m_CodePostal
            End Get
            Set(value As OracleString)
                m_CodePostal = value
            End Set
        End Property
     
        <OracleObjectMappingAttribute("VILLE")> _
        Public Overridable Property Ville() As String
            Get
                Return m_Ville
            End Get
            Set(value As String)
                m_Ville = 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)
            OracleUdt.SetValue(con, pUdt, "VILLE", Me.Ville)
        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 = DirectCast(OracleUdt.GetValue(con, pUdt, "CODE_POSTAL"), OracleString)
            Me.Ville = OracleUdt.GetValue(con, pUdt, "VILLE").ToString
        End Sub
     
        Public ReadOnly Property IsNull As Boolean Implements INullable.IsNull
            Get
                Return Me.m_IsNull
            End Get
        End Property
     
        Public Shared ReadOnly Property Null() As clsTest
            Get
                Dim obj As New clsTest()
                obj.m_IsNull = True
                Return obj
            End Get
        End Property
     
        Public Overrides Function ToString() As String
            ' TODO : Return a string that represents the current object
            Return ""
        End Function
     
        Public Shared Function Parse(str As String) As clsTest
            ' TODO : Add code needed to parse the string and get the object represented by the string
            Return New clsTest()
        End Function
     
    End Class
     
    <OracleCustomTypeMappingAttribute("ZZZ_OBJ_VILLE")> _
    Public Class clsTestFactory
        Implements IOracleCustomTypeFactory
     
        Public Function CreateObject() As IOracleCustomType Implements IOracleCustomTypeFactory.CreateObject
            Dim obj As New clsTest()
            Return obj
        End Function
    End Class
     
    ************************
    ' Code appelant
     
    Dim MonTest As New clsTest()
    MonTest.CodePostal = "cp"
    MonTest.Ville = "ville"
     
    Dim cmdProcedure As OracleCommand = New OracleCommand
     
    Try
        With cmdProcedure
            .Connection = ...
            .CommandType = CommandType.StoredProcedure
            .CommandText = "<user proprio>.zzz_procedure"
     
            Dim param As OracleParameter = New OracleParameter
            param.OracleDbType = OracleDbType.Object
            param.Direction = ParameterDirection.Input
            ' Note: The UdtTypeName is case-senstive
            param.UdtTypeName = "<user proprio>.ZZZ_OBJ_VILLE"
            param.Value = MonTest
            cmdProcedure.Parameters.Add(param)
     
        End With
     
        cmdProcedure.ExecuteNonQuery()
     
    Catch oraex As OracleException
        ...
     
    Catch ex As Exception
         ...
    End Try

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 30/06/2014, 12h10
  2. pb d'interface avec une procédure Oracle stockée
    Par awalter1 dans le forum Général Python
    Réponses: 5
    Dernier message: 24/09/2012, 10h21
  3. Réponses: 8
    Dernier message: 28/04/2009, 22h33
  4. Lancer une procédure avec "Worksheet_Change" sur une sélection multiple
    Par man_coef dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 20/06/2008, 11h29
  5. Lancer une procédure avec un paramètre (débutant)
    Par Daniel MOREAU dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 27/10/2006, 15h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo