2017-10-02 3 views
0

j'ai une procédure dans l'oracle pour déchiffrer le mot de passe avec un et un des paramètres. J'essaye d'appeler dans mon programme de Java comme suit mais il montre SQLGrammarException. Je suis nouveau à Oracle et essaye ceci pour la première fois. Désolé, j'ai cherché sur internet mais je n'ai rien trouvé. Dans le serveur SQL que j'utilisais comme ceci.procédures d'appel Oracle en java

Iterator it = hibernateSession.createSQLQuery("EXEC DAN_DANAPP_DECRYPPWD '" + username.getText().trim() + "'").list().iterator(); 

il travaillait dans le serveur SQL. Quand j'ai essayé la même chose dans Oracle, ça ne fonctionnait pas. Quelqu'un peut-il me repérer quelle erreur j'avais tenté.

Ma procédure Oracle est la suivante

CREATE OR REPLACE PROCEDURE DAN0703.DAN_DANAPP_DECRYPPWD 
(EMPNO IN VARCHAR2,P_STRING OUT VARCHAR2) 
IS 

P_KEY_STRING VARCHAR2(12) := 'xxxxxxxxxxxx'; 
P_ERROR_NO NUMBER; 
RAW_KEY RAW(128); 
DECRYPTED_RAW RAW(2048); 

BEGIN 

RAW_KEY := UTL_RAW.CAST_TO_RAW(P_KEY_STRING); 

select USER_PASSWD into P_STRING FROM MENU_USER WHERE USER_ID = EMPNO AND 
USER_FLAG = 'O' and (USER_DISABLE_FLAG='N' or USER_DISABLE_FLAG='V'); 

DBMS_OBFUSCATION_TOOLKIT.DESDECRYPT(INPUT => P_STRING, KEY => RAW_KEY, 
DECRYPTED_DATA => DECRYPTED_RAW); 

P_STRING := UTL_RAW.CAST_TO_VARCHAR2(DECRYPTED_RAW); 

END; 

Merci d'avance pour votre soutien.

+0

utilisez-vous cadre de mise en veille prolongée ou JDBC simple? et qu'est ce que 'loginsession'? – Ravi

+0

Désolé, j'ai oublié de mentionner. Oui, j'utilise le framework hibernate et c'est ma variable de session. – JavDev

+0

createSQLQuery semble être deprectaed https://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/query/QueryProducer.html#createSQLQuery-java.lang.String- – Ravi

Répondre

1

Peut-être quelque chose comme ça:

Iterator it = loginsession.createSQLQuery("CALL DAN_DANAPP_DECRYPPWD(:EMPNO)") 
.setParameter("EMPNO", username.getText().trim()).list().iterator(); 

EDIT

Un lien expliquant de traiter avec des paramètres sur avec JPA:

https://vladmihalcea.com/how-to-call-oracle-stored-procedures-and-functions-from-hibernate/

+0

J'ai essayé mais l'erreur suivante est à venir. java.sql.SQLException: ORA-06553: PLS-306: mauvais numéro ou types d'arguments en appel à 'DAN_DANAPP_DECRYPPWD' – JavDev

+0

C'est parce que votre procédure stockée attend également un paramètre 'OUT' (' P_STRING'). Cela ne peut pas être passé via la méthode '.setParameter'. Envisagez de refactoriser votre procédure stockée pour ne pas exiger ce paramètre 'OUT'. par exemple. https://stackoverflow.com/questions/20349227/how-to-call-a-stored-procedure-from-hibernate-having-both-in-and-out-parameters – pleft

+0

Donc, pas de moyens de sortir le paramètre en Java? ? – JavDev

1

Oracle appeler une procédure que vous avez à code:

loginSession.createSQLQuery("CALL DAN0703.DAN_DANAPP_DECRYPPWD(:username)") 
    .setParameter("username", username.getText().trim());