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

Macros et VBA Excel Discussion :

Pas de retour sur un paramètre output depuis une procédure stockée oracle


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 5
    Par défaut Pas de retour sur un paramètre output depuis une procédure stockée oracle
    Bonjour,

    Tout d'abord, je ne connais que très succinctement le VB.
    Je suis en excel 2010, et j'ai créé une fonction vba qui se connecte sur une base oracle 11g, et exécute une procédure stockée.

    J'ai deux types de paramètres :
    - des paramètres input
    - un paramètres output

    Quand j’exécute ma fonction :
    - je n'ai pas de message d'erreur
    - la procédure oracle s'exécute bien comme je le souhaite, et donne les résultats attendues
    - MAIS : le paramètre output me revient a "null"

    Or, lorsque j'exécute cette procédure oracle directement sur sql developper, j'ai un résultat.

    Pour valider que ce n'était pas mon code qui était mauvais, j'ai retrouvé exactement le même exemple dans un tutoriel de ce site, que j'ai déployé en exemple sur mon serveur, et j'obtiens exactement le même résultat que sur ma procédure, à savoir :
    - je n'ai pas de message d'erreur
    - la procédure oracle s'exécute bien comme je le souhaite, et donne les résultats attendues
    - MAIS : le paramètre output me revient a "null"

    Ci dessous, la procédure "exemple" déployée exprès.

    Si qqun a une idée, merci.

    -- procédure oracle

    Code oracle : 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
    create or replace package odbpack as
    Procedure Proc(param1 in number,param2 in out number,
    param3 out number);
    Function Func(param1 in varchar2, param2 in out varchar2,
    param3 out varchar2) return number;
    end odbpack;
    /
     
    create or replace package body odbpack as
    Procedure Proc(param1 in number,param2 in out number,
    param3 out number) is
    begin
    param2 := param1+param2;
    param3 := param1;
    end;
     
    Function func(param1 in varchar2, param2 in out varchar2,
    param3 out varchar2) return number is
    begin
    param2 := param1||param2;
    param3 := param1;
    return length(param2);
    end;
    end odbpack;
    /

    ' fonction vba
    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
    Private Sub Callproc_Click()
        'Dim er As adoError
        'On Error GoTo CnEh
        Dim cnn1 As ADODB.Connection
        Dim cmdExeproc As ADODB.Command
     
        ' Open connection.
        Set cnn1 = New ADODB.Connection
     
        ' Modify the following line to reflect a DSN within your environment
        strCnn = "DSN=mondsn; UID=monlogin; PWD=monpswd;"
        cnn1.Open strCnn
        Set cmdExeproc = New ADODB.Command
        cmdExeproc.ActiveConnection = cnn1
        cmdExeproc.CommandText = "{call odbpack.proc(?,?,?)}"
     
        ' In the next set of code, we have to manually set
        ' the parameter types since ADO and ODBC cannot derive this
        ' information when calling packaged procedures.
        cmdExeproc.Parameters(0).Value = 1
        cmdExeproc.Parameters(1).Direction = adParamInputOutput
        cmdExeproc.Parameters(1).Value = 2
        cmdExeproc.Parameters(2).Direction = adParamOutput
     
        cmdExeproc.Execute
        MsgBox ("Return Values from Proc are : " & _
                cmdExeproc.Parameters(1).Value & _
                " and " & _
                cmdExeproc.Parameters(2).Value)
     
        Set cmdExeproc = New ADODB.Command
     
        cmdExeproc.ActiveConnection = cnn1
     
        cmdExeproc.CommandText = "{? = call odbpack.func(?,?,?)}"
     
        ' In the next set of code, we have to manually set
        ' the parameter types since ADO and ODBC cannot derive this
        ' information when calling packaged procedures.
        cmdExeproc.Parameters(0).Direction = adParamReturnValue
        cmdExeproc.Parameters(1).Value = "Odd"
        cmdExeproc.Parameters(2).Direction = adParamInputOutput
        cmdExeproc.Parameters(2).Value = "Fred"
        cmdExeproc.Parameters(3).Direction = adParamOutput
        cmdExeproc.Execute
        MsgBox ("Return Values from Func are : " & _
                cmdExeproc.Parameters(0).Value & _
                " and " & _
                cmdExeproc.Parameters(2).Value & _
                " and " & _
                cmdExeproc.Parameters(3).Value)
     
        ' Close Connection
        cnn1.Close
    End Sub

  2. #2
    Invité
    Invité(e)
    Par défaut Bonjour,test ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dim MonRecordset As ADODB.Recordset
    set MonRecordset =cmdExeproc.Execute

  3. #3
    Membre à l'essai
    Inscrit en
    Septembre 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 5
    Par défaut
    Bonjour
    J'ai inséré les lignes, mais je ne suis pas sur de la synthaxe, vu que je ne sais pas a quoi ca sert (cf ci dessous)
    Le résultat est identique.
    Merci
    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
    Private Sub Callproc_Click()
        'Dim er As adoError
        'On Error GoTo CnEh
        Dim cnn1 As ADODB.Connection
        Dim cmdExeproc As ADODB.Command
        Dim MonRecordset As ADODB.Recordset
     
     
        ' Open connection.
        Set cnn1 = New ADODB.Connection
     
        ' Modify the following line to reflect a DSN within your environment
        strCnn = "DSN=mondsn; UID=monlogin; PWD=monpsw;"
        cnn1.Open strCnn
        Set cmdExeproc = New ADODB.Command
        cmdExeproc.ActiveConnection = cnn1
        cmdExeproc.CommandText = "{call odbpack.proc(?,?,?)}"
     
        ' In the next set of code, we have to manually set
        ' the parameter types since ADO and ODBC cannot derive this
        ' information when calling packaged procedures.
        cmdExeproc.Parameters(0).Value = 1
        cmdExeproc.Parameters(1).Direction = adParamInputOutput
        cmdExeproc.Parameters(1).Value = 2
        cmdExeproc.Parameters(2).Direction = adParamOutput
     
        cmdExeproc.Execute
        MsgBox ("Return Values from Proc are : " & _
                cmdExeproc.Parameters(1).Value & _
                " and " & _
                cmdExeproc.Parameters(2).Value)
     
        Set cmdExeproc = New ADODB.Command
     
        cmdExeproc.ActiveConnection = cnn1
     
        cmdExeproc.CommandText = "{? = call odbpack.func(?,?,?)}"
     
        ' In the next set of code, we have to manually set
        ' the parameter types since ADO and ODBC cannot derive this
        ' information when calling packaged procedures.
        cmdExeproc.Parameters(0).Direction = adParamReturnValue
        cmdExeproc.Parameters(1).Value = "Odd"
        cmdExeproc.Parameters(2).Direction = adParamInputOutput
        cmdExeproc.Parameters(2).Value = "Fred"
        cmdExeproc.Parameters(3).Direction = adParamOutput
        ' cmdExeproc.Execute
        Set MonRecordset = cmdExeproc.Execute
     
        MsgBox ("Return Values from Func are : " & _
                cmdExeproc.Parameters(0).Value & _
                " and " & _
                cmdExeproc.Parameters(2).Value & _
                " and " & _
                cmdExeproc.Parameters(3).Value)
     
        ' Close Connection
        cnn1.Close
    End Sub

  4. #4
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim msg As String
    Set MonRecordset = cmdExeproc.Execute
    While MonRecordset.EOF = False
        For f = 0 To MonRecordset.Fields.Count -1
            If msg = "" Then
            msg = msg & MonRecordset(f).Value
            Else
                msg = msg & " AND " & MonRecordset(f).Value
            End If
            msg = msg & vbCrLf
        Next
        MonRecordset.MoveNext
    Wend
    MsgBox msg

  5. #5
    Membre à l'essai
    Inscrit en
    Septembre 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 5
    Par défaut erreur de code
    j'ai essayé de l'intégrer à mon code
    j'ai l'erreur suivante,

    erreur d'exécution '3704':
    erreur définie par l'application ou par l'objet.

    Du coup, j'ai essayé de mettre en commentaire la plupart du code ajouté, et j'ai la meme erreur (cf ci dessous)....

    Merci

    ps : après vérification, j'ai l'impression qu'un recordset est valable pour une requete, or moi, j'attaque une proc stock qui renvoie un paramètre. Est ce quand meme la bonne méthode?
    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
    Private Sub Callproc_Click()
        'Dim er As adoError
        'On Error GoTo CnEh
        Dim cnn1 As ADODB.Connection
        Dim cmdExeproc As ADODB.Command
        Dim MonRecordset As ADODB.Recordset
     
        ' Open connection.
        Set cnn1 = New ADODB.Connection
     
        ' Modify the following line to reflect a DSN within your environment
        strCnn = "DSN=mondsn; UID=monlogin; PWD=monpswd;"
     
        cnn1.Open strCnn
        Set cmdExeproc = New ADODB.Command
        cmdExeproc.ActiveConnection = cnn1
        cmdExeproc.CommandText = "{call odbpack.proc(?,?,?)}"
     
        ' In the next set of code, we have to manually set
        ' the parameter types since ADO and ODBC cannot derive this
        ' information when calling packaged procedures.
        cmdExeproc.Parameters(0).Value = 1
        cmdExeproc.Parameters(1).Direction = adParamInputOutput
        cmdExeproc.Parameters(1).Value = 2
        cmdExeproc.Parameters(2).Direction = adParamOutput
     
        ' cmdExeproc.Execute
        Set MonRecordset = cmdExeproc.Execute
     
        While MonRecordset.EOF = False
            ' For f = 0 To MonRecordset.Fields.Count - 1
                ' If msg = "" Then
                ' msg = msg & MonRecordset(f).Value
                ' Else
                '     msg = msg & " AND " & MonRecordset(f).Value
                ' End If
                ' msg = msg & vbCrLf
     
            ' Next
            MonRecordset.MoveNext
        Wend
        ' MsgBox msg
     
        MsgBox ("Return Values from Proc are : " & _
        cmdExeproc.Parameters(1).Value & _
        " and " & _
        cmdExeproc.Parameters(2).Value)
     
        Set cmdExeproc = New ADODB.Command
     
        cmdExeproc.ActiveConnection = cnn1
     
        cmdExeproc.CommandText = "{? = call odbpack.func(?,?,?)}"
     
        ' In the next set of code, we have to manually set
        ' the parameter types since ADO and ODBC cannot derive this
        ' information when calling packaged procedures.
        cmdExeproc.Parameters(0).Direction = adParamReturnValue
        cmdExeproc.Parameters(1).Value = "Odd"
        cmdExeproc.Parameters(2).Direction = adParamInputOutput
        cmdExeproc.Parameters(2).Value = "Fred"
        cmdExeproc.Parameters(3).Direction = adParamOutput
     
        ' cmdExeproc.Execute
        Set MonRecordset = cmdExeproc.Execute
     
        MsgBox ("Return Values from Func are : " & _
        cmdExeproc.Parameters(0).Value & _
        " and " & _
        cmdExeproc.Parameters(2).Value & _
        " and " & _
        cmdExeproc.Parameters(3).Value)
     
        ' Close Connection
        cnn1.Close
    End Sub

  6. #6
    Invité
    Invité(e)
    Par défaut
    oui le recordset est une requête; on retourne sous forme de requête le résultat de la commande execute.

Discussions similaires

  1. [Débutant] Retour d'une procédure stockée Oracle avec paramètre NULL
    Par Hobbi1 dans le forum VB.NET
    Réponses: 4
    Dernier message: 22/12/2014, 19h07
  2. Réponses: 6
    Dernier message: 15/09/2010, 18h02
  3. Réponses: 2
    Dernier message: 26/01/2010, 10h05
  4. Réponses: 4
    Dernier message: 17/12/2007, 08h29
  5. Envoyer un mail depuis une procédure stockée
    Par bd0606 dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 03/10/2005, 11h51

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