Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
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 20/10/2011, 14h49   #1
Invité de passage
 
Inscription : octobre 2008
Messages : 36
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 36
Points : 1
Points : 1
Par défaut Exception ORA-06502 avec owa.cookie

Bonjour, j'ai un petit soucis depuis plusieurs jours lors de l’utilisation de la librairie owa.cookie (fonction get)

j'ai créé une gestion des session en pl/sql comme suit:

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
CREATE OR REPLACE package SessionPK AS
	session_duration constant number := 120; -- minutes(2h)
 
	FUNCTION is_logged RETURN number;
	FUNCTION check_login (p_login IN client.Login%type, p_password IN client.Pass%type) RETURN number;
	procedure get_user(p_lastname out personne.nom%type, p_firstname out personne.prenom%type);
	procedure logout;
 
end SessionPK;
/
 
CREATE OR REPLACE
package body SessionPK AS
	FUNCTION get_session_id RETURN varchar2 IS
		session_cookie   owa_cookie.cookie;
		session_id       varchar2 (32);
		last             date;
	begin
		session_cookie := owa_cookie.get ('sessionid');
 
		IF session_cookie.num_vals = 0 then
		   RETURN NULL;
		end IF;
 
		session_id := session_cookie.vals (session_cookie.vals.first);
 
		begin
		   SELECT sessions.last INTO last FROM sessions WHERE sessions.id_session = session_id;
			exception
				when no_data_found then
					owa_cookie.remove ('sessionid', session_id);
			RETURN NULL;
		end;
 
		IF sysdate > last + SessionPK.session_duration / 1440 then
			owa_cookie.remove ('session_id', session_id);
			DELETE FROM sessions WHERE id_session = session_id;
			commit;
			RETURN NULL;
		end IF;
 
		UPDATE sessions SET last = sysdate WHERE id_session = session_id;
		RETURN session_id;
    /*exception
      when others then
        centrale.ajoutLog('SessionPK.get_session_id',SQLCODE,SQLERRM);*/
	end get_session_id;
 
 
 
 
	FUNCTION check_login (p_login IN client.Login%type, p_password IN client.Pass%type) RETURN number IS
		v_session_id      varchar2 (32);
		v_client_id       client.id_client%type;
	begin
    v_session_id := get_session_id;
		IF v_session_id IS NOT NULL then
			centrale.ajoutLog('sessionPK.check_login',SQLCODE,SQLERRM,'Client deja connecté');
      RETURN 0;
		end IF;
 
		begin
			SELECT id_client INTO v_client_id FROM client WHERE login LIKE p_login AND pass LIKE p_password;
		exception when no_data_found then
			RETURN 0;
		end;
 
		SELECT sys_guid () INTO v_session_id FROM dual;
 
		owa_cookie.send ('sessionid', v_session_id, sysdate + 30 / 1440);
 
		INSERT INTO sessions VALUES (v_session_id, v_client_id, sysdate);
		commit;
		RETURN 1;
	end check_login;
 
 
 
	...
 
end SessionPK;
j'ai essayé à partir de sqldev de tester ma fonction et j'obtiens:

Code :
1
2
3
4
5
6
7
declare
		rep numeric;
begin
    rep := sessionpk.check_login('login','pass');
    IF(rep = 1) then dbms_output.put_line('login: true');
    else dbms_output.put_line('login: false'); end IF;
end;
Code :
1
2
3
4
5
6
7
8
9
10
11
Rapport d'erreur :
ORA-06502: PL/SQL : erreur numérique ou erreur sur une valeur
ORA-06512: à "SYS.OWA_UTIL", ligne 354
ORA-06512: à "SYS.OWA_COOKIE", ligne 67
ORA-06512: à "SYS.OWA_COOKIE", ligne 183
ORA-06512: à "CENTRALBEL.SESSIONPK", ligne 7
ORA-06512: à "CENTRALBEL.SESSIONPK", ligne 57
ORA-06512: à ligne 4
06502. 00000 -  "PL/SQL: numeric or value error%s"
*Cause:    
*Action:
or hier, le même appel à la même fonction retournait une valeur correcte (en pl/sql mais pas depuis un appel java)
j'en avais pour preuve des ajouts correct dans une table de ma base avec l'id du cookie...

appel sql:
Code :
1
2
3
4
5
 declare
rep number;
begin
rep := sessionpk.check_login('login','pass');
end;
kranagard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2011, 10h10   #2
Invité de passage
 
Inscription : octobre 2008
Messages : 36
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 36
Points : 1
Points : 1
bon, j'ai modifié mon message un peu vite... il faut attendre un peu qu'oracle lance les services nécessaires je pense, en tout cas maintenant ça fonctionne en pl/sql

par contre en java j’obtiens l'erreur précédemment cité...

Code :
1
2
CallableStatement rs;
        rs = getOracle().callFunction("CentralBel.sessionpk.check_login", args, Types.NUMERIC);
acdb contient la methode:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public synchronized CallableStatement callFunction(String proc,String[] args, Integer type) throws SQLException{
        String query = "{? = call "+proc+"(";
        IF(args != NULL)
            FOR(String arg : args){
                IF(query.lastIndexOf("?")!=query.length()-1)
                    query += "?";
                else
                    query += ",?";
            }
        query += ")}";
        CallableStatement stmt = con.prepareCall(query);
        stmt.registerOutParameter(1, type);
        int ind = 2;
        FOR(String arg : args){
            stmt.setString(ind, arg);
            ind++;
        }
        stmt.execute();
 
        System.out.println("CallFunc realise");
        RETURN stmt;
    }
la méthode est bien trouvée à la vue du rapport d'erreur, mais pourquoi ai-je une erreur alors qu'en pl/sql je n'en est pas?

ps: j’utilise Firefox et j'autorise les cookies (pour l'occasion...). j'ai aussi essayé avec google chrome mais idem.
kranagard est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h33.


 
 
 
 
Partenaires

Hébergement Web