【问题标题】:Calling Oracle procedures in java在java中调用Oracle过程
【发布时间】:2018-03-13 14:00:39
【问题描述】:

我在 oracle 中有一个使用一进一出参数解密密码的程序。我正在尝试按如下方式调用我的 java 程序,但它显示 SQLGrammarException。我是 Oracle 的新手,第一次尝试这个。对不起,我在互联网上搜索,但我没有找到任何东西。 在 SQL server 中我是这样使用的。

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

它在 SQL Server 中运行。当我在 Oracle 中尝试相同的方法时,它不起作用。谁能发现我犯了什么错误。

我的Oracle程序如下

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;

提前感谢您的支持。

【问题讨论】:

标签: java sql-server hibernate stored-procedures


【解决方案1】:

也许是这样的:

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

编辑

解释用 JPA 处理 out 参数的链接:

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

【讨论】:

  • 我试过了,但是下面的错误来了。 java.sql.SQLException: ORA-06553: PLS-306: 调用“DAN_DANAPP_DECRYPPWD”时参数的数量或类型错误
  • 这是因为您的存储过程也在等待OUT 参数(P_STRING)。这不能通过.setParameter 方法传递。考虑重构您的存储过程以不需要此OUT 参数。例如stackoverflow.com/questions/20349227/…
  • 所以没有办法在 Java 中获取 OUT 参数??
【解决方案2】:

在 oracle 中调用你必须编码的过程:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-13
    • 2012-01-27
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多