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; |