Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > Langages serveur > ASP
ASP Forum sur la programmation ASP. Avant de poster : Cours ASP, FAQ ASP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/09/2007, 14h42   #1
Invité régulier
 
Inscription : décembre 2005
Messages : 12
Détails du profil
Informations personnelles :
Âge : 38
Localisation : Belgique

Informations forums :
Inscription : décembre 2005
Messages : 12
Points : 5
Points : 5
Envoyer un message via MSN à mike devimo
Par défaut Problème d'affichage de recordset provenant d'une procédure stockée oracle

Bonjour,

je n'arrive pas à faire apparaître l'output d'une procédure stockée
contenue dans un package oracle.

Voici mon code.

1. la procédure

- package

Code :
1
2
3
4
5
6
7
8
9
10
 /* Une procédure qui émet trois données */  
 
 AS
 
 PROCEDURE allperson
            (charges_c_c_code    OUT   number  ,
             charges_c_c_cma_fk  OUT   number  ,
             charges_c_c_prix    OUT   number  );
 
END pack_str_proc;
- corps de package

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
AS
 
PROCEDURE    allperson
            (charges_c_c_code    OUT     number,
             charges_c_c_cma_fk  OUT     number,
             charges_c_c_prix    OUT     number)
 
IS
 
CURSOR charge_cur IS
 
SELECT charges_c_c_code, charges_c_c_cma_fk, charges_c_c_prix
FROM   dev_bud_charges_c_centre
where  charges_c_c_code = 64000200;
 
percount NUMBER DEFAULT 1;
 
BEGIN
 
    FOR singlecharge IN charge_cur
 
    LOOP
            charges_c_c_code   := singlecharge.charges_c_c_code;
            charges_c_c_cma_fk := singlecharge.charges_c_c_cma_fk;
            charges_c_c_prix   := singlecharge.charges_c_c_prix;
            percount           := percount + 1;
    END LOOP;
 
END;
cette procédure est valide.

2. code ASP

Je désire simplement afficher les trois paramètres de sortie de ma procédure
en créant une boucle sur un recordset.

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
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
 
 
<%@ LANGUAGE = "VBScript" %>
<% Option Explicit %>
 
<!--#include file= "../adovbs.inc"                                    -->
<!--#include file= "../connections/connectOracle.asp"                 -->
 
<%
 
'
connectionOracle.cursorLocation = aduseClient
 
dim comm
Set comm = Server.CreateObject("ADODB.Command")
 
Set comm.ActiveConnection = connectionOracle
comm.commandtype          = 4   
comm.commandtext          = "pack_str_proc.allperson"
 
'If your stored procedure accepts IN parameters and returns OUT parameters
'here's how to go about it
 
comm.Parameters.Append comm.CreateParameter("charges_c_c_code",  3,2)
comm.Parameters.Append comm.CreateParameter("charges_c_c_cma_fk",3,2)
comm.Parameters.Append comm.CreateParameter("charges_c_c_prix",  3,2)
 
 
    'Note that 3 = adInteger for the datatype
    'Note that 1 = adParamInput and 2 = adParamOutput for parameter direction
 
'This code creates a recordset object.
 
dim rsEmp
Set rsEmp        = Server.CreateObject("ADODB.Recordset")
 
rsEmp.CursorType = adOpenStatic
 
Set rsEmp.Source = comm
 
rsEmp.Open 'comm , connectionOracle, adOpenKeyset, adLockOptimistic
%>
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" content="text/html; charset=iso-8859-1">
<TITLE>Retrieving a Recordset from an Oracle Stored Procedure using ADO on ASP</TITLE>
</HEAD>
<BODY>
<form>
 
<%
 
'Traverse through the recordset and display the data
 
	While Not rsEmp.EOF
		Response.Write(rsEmp(0) & "&#xa0;" & rsEmp(1) &  "<BR />")
		rsEmp.MoveNext
	Wend
 
%>
 
</form>
 
<%
 
'Close the Recordset and the Connection
rsEmp.Close
connectionOracle.close
 
' Dereference the ADO Objects
Set comm = nothing
Set rsEmp = nothing
set connectionOracle = Nothing
 
%>
 
</body>
</html>
Je n'arrive pas à trouver une SYNTAXE EXACTE pour la méthode EXECUTE et l'emploi du recordset.

J'obtiens avec le code ci-dessus, le message suivant:


Code :
1
2
3
4
Error Type:
ADODB.Recordset (0x800A0E78)
Operation is not allowed when the object is closed.
/devimo/budget_fr/strproc_6.asp, line 53
Merci pour votre aide !!!!
mike devimo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2007, 16h17   #2
Modérateur
 
Avatar de roro06
 
Inscription : avril 2007
Messages : 1 364
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : avril 2007
Messages : 1 364
Points : 1 551
Points : 1 551
Bonjour

(Je ne connais pas trop oracle, mais on va quand-meme essayer)


je suppose que l'erreur est là:
Code :
Set rsEmp.Source = comm
Je mettrais plutôt (pas le chien ):
Code :
rsEmp = comm.execute();
auquel cas la methode open() qui suit devient superflue (et même risque de générer une erreur).

essaie et dis-moi
roro06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2007, 17h01   #3
Invité régulier
 
Inscription : décembre 2005
Messages : 12
Détails du profil
Informations personnelles :
Âge : 38
Localisation : Belgique

Informations forums :
Inscription : décembre 2005
Messages : 12
Points : 5
Points : 5
Envoyer un message via MSN à mike devimo
c'est spécial car il ne reconnaît pas la méthode EOF du recordset:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<form>
 
<%
 
'Traverse through the recordset and display the data
if not rsEmp.eof then
	While Not rsEmp.EOF
		Response.Write(rsEmp(0) & "&#xa0;" & rsEmp(1) &  "<BR />")
		rsEmp.MoveNext
	Wend
end if
%>
 
</form>

J'obtiens en réponse :

Code :
1
2
3
4
5
 
Error Type:
Microsoft VBScript runtime (0x800A01B6)
Object doesn't support this property or method: 'eof'
/devimo/budget_fr/strproc_6.asp, line 52
mike devimo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2007, 08h54   #4
Modérateur
 
Avatar de roro06
 
Inscription : avril 2007
Messages : 1 364
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : avril 2007
Messages : 1 364
Points : 1 551
Points : 1 551
C'est un peu bizarre, ça

ca vient peut-etre du adOpenStatic. J'y crois pas trop, mais bon ! essaye avec adOpenForwardOnly
roro06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2007, 11h28   #5
Modérateur
 
Avatar de roro06
 
Inscription : avril 2007
Messages : 1 364
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : avril 2007
Messages : 1 364
Points : 1 551
Points : 1 551
Non, en y regardant mieux, c'est le cursorlocation qui pose problème (cursor client)
Utilises plutôt adUseServer
roro06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2007, 17h43   #6
Invité régulier
 
Inscription : décembre 2005
Messages : 12
Détails du profil
Informations personnelles :
Âge : 38
Localisation : Belgique

Informations forums :
Inscription : décembre 2005
Messages : 12
Points : 5
Points : 5
Envoyer un message via MSN à mike devimo
... Apparemment ce n'est pas là qu'est le problème.

Suivant http://support.microsoft.com/kb/229919

on utiliserait plutôt aduseClient

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
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
<%@ LANGUAGE="VBSCRIPT" %>
 
<%
	'Constants
	adCmdUnknown = 0
	adCmdText = 1
	adCmdTable = 2
	adCmdText = 1
	adParamInput = 1
	adParamOutput = 2
	adInteger = 3
	adUseClient = 3
	adOpenStatic = 3
 
	Dim cnnOracle
	Dim cmdStoredProc
	Dim rsEmp
 
	'This code creates a connection object.
	Set cnnOracle = Server.CreateObject("ADODB.Connection")
	cnnOracle.CursorLocation = adUseClient
 
	'System DSN connection
	'strConn = "DSN=OracleDSN; UID=UserID; PWD=Password"
 
	'DSN-less connection
	strConn = "DRIVER={Microsoft ODBC for Oracle}; SERVER=DatabaseAlias; UID=UserID; PWD=Password"
 
	'OLE DB connection
	'strConn = "Provider=MSDAORA.1; Data Source=DatabaseAlias; User ID=UserID; Password=Password"
 
'Note:  The DatabaseAlias is the name that was created in SQL*Net Easy Configuration or in Net8.
 
	cnnOracle.Open strConn
 
	'This code creates a command object.
	Set cmdStoredProc = Server.CreateObject("ADODB.Command")
	Set cmdStoredProc.ActiveConnection = cnnOracle
 
	'Retrieve only one record
	'cmdStoredProc.CommandText = "{call packperson.oneperson(?,{resultset 2, ssn, fname, lname})}"
	'cmdStoredProc.CommandType = adCmdText
	'cmdStoredProc.Parameters.Append cmdStoredProc.CreateParameter("wildcard",adInteger,adParamInput)
 
	'Retrieve all records.
	cmdStoredProc.CommandText = "{call packperson.allperson({resultset 9, ssn, fname, lname})}"
	cmdStoredProc.CommandType = adCmdText
 
	'This code creates a recordset object.
	Set rsEmp = Server.CreateObject("ADODB.Recordset")
	rsEmp.CursorType = adOpenStatic
 
	Set rsEmp.Source = cmdStoredProc
 
	'Set the parameter for to get only one record
	'cmdStoredProc(0) = 555662222
 
	rsEmp.Open
%>
 
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual InterDev 6.0">
<META HTTP-EQUIV="Content-Type" content="text/html; charset=iso-8859-1">
<TITLE>Retrieving a Recordset from an Oracle Stored Procedure using ADO on ASP</TITLE>
</HEAD>
<BODY>
 
<%
        'Traverse through the recordset and display the data
	While Not rsEmp.EOF
		Response.Write(rsEmp(0) & "&#xa0;" & rsEmp(1) & " " & rsEmp(2) & "<BR>")
		rsEmp.MoveNext
	Wend
 
        ' Close the Recordset and the Connection
	rsEmp.Close
	cnnOracle.Close
 
        ' Dereference the ADO Objects
	Set cmdStoredProc = nothing
	Set rsEmp = nothing
	Set cnnOracle = nothing
 
%>
</BODY>
</HTML>

D'autre part j'ai pour l'instant - faute de résultats - abandonné la méthode de laprocédure stockée pour insérer mon code SQL dans ma page ASP directement . Je recontre encore malheureusement un problème.

voici le code (relatif à une fonction)

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
<%
FUNCTION get_montant_ecr(connect, compte ,site ,soc ,debut ,fin)
 
'dim get_montant_ecr
dim rs
set rs = Server.CreateObject("ADODB.RecordSet")   
 
SQL = "SELECT -sum(ecr_montant)"
SQL = SQL & "FROM ECRITURE, COMPTE_ANA, FINANCIER, societes"
SQL = SQL & "WHERE  cma_num_soc_cubic = soc_num_soc_cubic and ecr_cma_pk = cma_pk AND ecr_fin_pk = fin_pk"
SQL = SQL & "AND fin_code NOT IN('OUV','C/F','FIN')"  
SQL = SQL & "AND to_number(ecr_xxx_lien_1) = "&site
SQL = SQL & "and cma_pk = "&compte
SQL = SQL & "and to_number(ecr_periode) between "& debut & "and" & fin  
SQL = SQL & "and soc_num = "&soc
SQL = SQL & "and cma_compte between '6' and '8'"
SQL = SQL & "group by cma_compte,cma_libelle"
 
rs.open  SQL, connect,3,3
 
if not rs.eof then
 
	get_montant_ecr = cint(rs("-sum(ecr_montant)"))
else
	get_montant_ecr = 0	
end if	
	rs.close
	set rs = Nothing
 
end function
 
 
%>
En appelant cette fonction j'obtiens l'erreur suivante :

Code :
1
2
3
Error Type:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC driver for Oracle][Oracle]ORA-00933: SQL command not properly ended
alors que dans TOAD cette requête fonctionne parfaitement avec des valeurs assignées aux variables:

Code :
1
2
3
4
5
6
7
8
9
10
SELECT -sum(ecr_montant)
FROM   ECRITURE, COMPTE_ANA, FINANCIER, societes
WHERE  cma_num_soc_cubic = soc_num_soc_cubic and ecr_cma_pk = cma_pk AND ecr_fin_pk = fin_pk
AND fin_code NOT IN('OUV','C/F','FIN')
AND to_number(ecr_xxx_lien_1) = 3109
and cma_pk = 4636
and to_number(ecr_periode) between 200601 and 200612 
and soc_num = 94
and cma_compte between '6' and '8'
group by cma_compte,cma_libelle
où se trouverait l'erreur ?

Merci déjà Roro06 pour ton dévouement
mike devimo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2007, 18h53   #7
LEK
Membre éclairé
 
Inscription : mai 2005
Messages : 596
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 596
Points : 363
Points : 363
Salut. Ta requete a l'air correcte mais quand tu concatène le tout en asp pour la créer tu ne met aucun espace...
Par exemple :
au lieu d'écrire

Code :
1
2
SQL = SQL & "and cma_pk = "&compte
SQL = SQL & "and to_number(ecr_periode) between "& debut & "and" & fin
tu devrais écrire

Code :
1
2
SQL = SQL & " and cma_pk = "&compte
SQL = SQL & " and to_number(ecr_periode) between "& debut & " and" & fin
Lance ta page, effectue simplement un response.write de la requete sans l'éxécuter puis fait un copier coller de celle ci sous sqlplus et tu sera fixé
LEK est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/10/2007, 18h40   #8
Invité régulier
 
Inscription : décembre 2005
Messages : 12
Détails du profil
Informations personnelles :
Âge : 38
Localisation : Belgique

Informations forums :
Inscription : décembre 2005
Messages : 12
Points : 5
Points : 5
Envoyer un message via MSN à mike devimo
merci, cela fonctionne parfaitement.

Qd à l'appel aux procédures stockées, je réessaierai plus tard.
mike devimo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h57.


 
 
 
 
Partenaires

Hébergement Web