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
Partager