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

VBA Access Discussion :

[ACCESS 2003 SP2] Appel de procédure stockée et fonction stockée Oracle en VBA


Sujet :

VBA Access

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 41
    Points : 30
    Points
    30
    Par défaut [ACCESS 2003 SP2] Appel de procédure stockée et fonction stockée Oracle en VBA
    Bonjour,

    Je viens vers vous car j'ai besoin d'exécuter des procédures stockées et des fonctions stockées Oracle depuis du code VBA.

    J'ai déjà un module de classe de connexion dans lequel j'ai déjà créé une méthode d'exécution de procédures stockée qui fonctionne. Celle-ci prend en paramètre le nom de la procédure et un tableau de paramètres. Ce paramètre est un type que j'ai créé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public Type type_ParamStoredProc
        str_nameParam As String 'Nom du paramètre
        str_value As String 'Valeur du paramètre
        theDataType As DataTypeEnum 'Type du paramètre
        typeSize As Integer 'Taille du type (dans le cas varchar par exemple)
    End Type
    J'utilise une connexion que j'ai initialisée plus tôt et qui se nomme "conn" dans le code. Voici la le code qui éxecute la procédure stockée :

    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
    Public Sub ExecuteStoredProcedure(str_ProcName As String, tabParam() As type_ParamStoredProc)
     
        Dim cmdToExecute As ADODB.Command
        Dim i As Integer
        Dim theParam As ADODB.Parameter
     
        On Error GoTo gestErr
     
        Set cmdToExecute = New ADODB.Command
     
        'Initialisation de la commande via la connection en cours
        If Not isConnected Then
            connect
        End If
     
        Set cmdToExecute.ActiveConnection = conn
        cmdToExecute.CommandType = adCmdStoredProc
        cmdToExecute.CommandText = str_ProcName
     
       For i = 0 To UBound(tabParam) - 1
            If tabParam(i).typeSize <> 0 Then
                Set theParam = cmdToExecute.CreateParameter(tabParam(i).str_nameParam, tabParam(i).theDataType, adParamInput, tabParam(i).typeSize)
            Else
                Set theParam = cmdToExecute.CreateParameter(tabParam(i).str_nameParam, tabParam(i).theDataType, adParamInput)
            End If
     
            cmdToExecute.Parameters.Append theParam
            theParam.Value = tabParam(i).str_value
        Next i
     
        cmdToExecute.Execute
     
        Set cmdToExecute = Nothing
        Set theParam = Nothing
     
        Exit Sub
    gestErr:
        LogError Err.Number, Err.Description, "ExecuteStoredProcedure"
        Err.Raise Err.Number, , Err.Description
     
    End Sub
    Maintenant, ce que je souhaite, c'est faire la même chose mais pour une fonction stockée, et je souhaite récupérer la valeur de retour. Mais je n'y arrive pas

    Voilà ce que j'ai fait (en fait, j'ai ajouté un paramètre qui est la valeur de retour) :

    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
    Public Sub ExecuteStoredFunction(str_ProcName As String, tabParam() As type_ParamStoredProc, ByRef paramReturn As type_ParamStoredProc)
     
        Dim cmdToExecute As ADODB.Command
        Dim i As Integer
        Dim theParam As ADODB.Parameter
        Dim returnvalue As ADODB.Parameter
     
        On Error GoTo gestErr
     
        Set cmdToExecute = New ADODB.Command
     
        'Initialisation de la commande via la connection en cours
        If Not isConnected Then
            connect
        End If
     
        Set cmdToExecute.ActiveConnection = conn
        cmdToExecute.CommandType = adCmdUnknown 'ICI JE NE SAIS PAS QUOI METTRE (toujours adCmdStoredProcedure ?)
        cmdToExecute.CommandText = str_ProcName
     
        For i = 0 To UBound(tabParam) - 1
            If tabParam(i).typeSize <> 0 Then
                Set theParam = cmdToExecute.CreateParameter(tabParam(i).str_nameParam, tabParam(i).theDataType, adParamInput, tabParam(i).typeSize)
            Else
                Set theParam = cmdToExecute.CreateParameter(tabParam(i).str_nameParam, tabParam(i).theDataType, adParamInput)
            End If
     
            cmdToExecute.Parameters.Append theParam
            theParam.Value = tabParam(i).str_value
     
        Next i
     
      ' Valeur de retour 
      Set returnvalue = cmdToExecute.CreateParameter(, paramReturn.theDataType, adParamReturnValue)
     
     
        cmdToExecute.Parameters.Append returnvalue
     
        cmdToExecute.Execute
        paramReturn.str_value = returnvalue.Value
     
     
        Set cmdToExecute = Nothing
        Set theParam = Nothing
        Set returnvalue = Nothing
     
     
     
        Exit Sub
    gestErr:
        Debug.Print Err.Description
        LogError Err.Number, Err.Description,"ExecuteStoredFunction"
        Err.Raise Err.Number, , Err.Description
     
    End Sub
    Si quelqu'un à déja fait ça, merci de me dire ce qui ne va pas la dedans =)

  2. #2
    Membre expert
    Avatar de mout1234
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 210
    Points : 3 228
    Points
    3 228
    Par défaut
    Bonjour,

    De ce que je viens de voir sur une classe en C# trouvée sur le net, il semble qu'il te faille bien mettre adCmdStoredProc comme type de procédure.

    Tu as quel comportement? pas de valeur de retour? bug?
    ............................................................................................

    Dans l'intérêt de tous, ne posez pas de questions techniques par messages privés.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 41
    Points : 30
    Points
    30
    Par défaut
    Oui j'avais laissé le adCmdStoredProc, mais ca ne changeait rien.

    En fait j'ai une erreur Oracle : ORA-00900: invalid SQL statement

    Mais la fonction s'exécute correctement lorsque que je la lance depuis Oracle.

    Edit : L'erreur se fait sur le cmdToExecute.Execute

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 41
    Points : 30
    Points
    30
    Par défaut
    En fait quand je laisse adCmdStoredProc je n'ai pas le même message d'erreur :

    ORA-06550: line 1, column 7:
    PLS-00221: 'FN_EXTRACTION_ADD' is not a procedure or is undefined
    ORA-06550: line 1, column 7:
    PL/SQL: Statement ignored
    (FN_EXTRACTION_ADD étant le nom de la fonction stockée, et elle existe bien =))

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 41
    Points : 30
    Points
    30
    Par défaut
    Bon j'ai du neuf. En fait ma méthode fonctionne très bien. J'ai fait plusieurs tests, et il s'avère que le problème vient des paramètres de la procédures stockées.


    Voilà comment je remplis mon tableau de paramètre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ReDim Preserve tabDeParametre(UBound(tabDeParametre) + 1)
        tabDeParametre(UBound(tabDeParametre) - 1).str_nameParam = "pwet"
        tabDeParametre(UBound(tabDeParametre) - 1).theDataType = adVarChar
        tabDeParametre(UBound(tabDeParametre) - 1).str_value = "tata"
        tabDeParametre(UBound(tabDeParametre) - 1).typeSize = 5
    Et le problème n'arrive que lorsque j'essaie de passer du varchar! Quand c'est du numérique, pas de problèmes. Donc pour le theDataType
    , j'ai testé :

    adVarChar,
    dbText,
    dbChar

    mais je n'arrive pas à passer mon varchar

Discussions similaires

  1. Réponses: 3
    Dernier message: 09/06/2007, 13h19
  2. Calendrier - Date Time Picker Access 2003 SP2
    Par odelayen dans le forum Access
    Réponses: 2
    Dernier message: 01/09/2006, 12h09
  3. Update appelant une procédure stockées
    Par meufeu dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 06/10/2005, 18h31
  4. [appeler une procédure stockée]
    Par viny dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 10/03/2005, 22h38
  5. Appel de Procédure stockée en ASP
    Par James85 dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 14/11/2004, 17h55

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