【问题标题】:How to call a oracle procedure which deletes data using JDBC如何调用使用 JDBC 删除数据的 oracle 过程
【发布时间】:2016-10-09 14:08:38
【问题描述】:

我的 oracle 程序如下,用于从数据库中删除旧用户。

create or replace
PROCEDURE                 UNAVAILABLE_USER (INACTIVE IN NUMBER DEFAULT 90) IS                                                                                                                                          CHK_ACTIVE_USER (NUMOFDAYS IN NUMBER DEFAULT 90) IS 
  //VARIABLE DECLARATIONS
BEGIN
LOOP
  //SOME LOGIC TO FIND WHICH USER ACCOUNTS TO BE DELETED
   END LOOP;
  LOOP
      DELETE FROM SCHEEMA.TABLE1 WHERE userid = ''id'';
      DELETE FROM SCHEEMA.TABLE2 WHERE userid = ''id'';
    END LOOP;
    COMMIT;
  END IF;
EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK;
END UNAVAILABLE_USER;

就 oracle 程序而言,它可以正常工作并在 SQL 开发人员检查时删除数据。我需要从 java DAO 层执行它..我一直在尝试执行下面的过程..

connection = UserProfileDAO.getJDBCConnection();
CallableStatement statement = null;
String query = "CALL " + USER_SCHEMA + ".UNAVAILABLE_USER(?)";
statement = connection.prepareCall(query);
statement.setInt(1, Num_Off_Days);
statement.executeUpdate();

它正在部署和运行良好,从 java 端没有问题,但从 db 端删除数据

09:54:37,761 信息 [com.alok.user.data.UserProfileDAO] (pool-11-thread-1) 内删除用户 09:55:04,250 INFO [stdout] (pool-11-thread-1) CALL USER_SCHEMA.UNAVAILABLE_USER(?)

您能否帮助我如何诊断问题以及它与 DB 的交互方式。任何其他解决方案都将是可观的。在此先感谢。

【问题讨论】:

  • 连接是否处于自动提交模式?如果否,您的代码必须在删除后进行提交:connection.commit();在末尾追加这一行,无论自动提交状态如何,它都会起作用。
  • 是的..它处于自动提交模式
  • 我还尝试在事务之前将自动提交模式设置为 false .. 这也不起作用..
  • 您能否尝试从您的过程中删除整个异常部分并从 Java 中执行它。这样你就可以确定它在从 Java 执行时没有遇到任何异常。
  • 您的应用数据库用户是否拥有DELETE 权限?

标签: java oracle hibernate stored-procedures jdbc


【解决方案1】:

看来您调用存储过程的 JDBC 语法有问题;您应该用 花括号 将调用字符串括起来。你可以试试这样的:

connection = UserProfileDAO.getJDBCConnection();
String call = "{ CALL " + USER_SCHEMA + ".UNAVAILABLE_USER(?) }";

try (CallableStatement statement = connection.prepareCall(call)) {
    statement.setInt(1, Num_Off_Days);
    statement.execute();
} catch (SQLException e) {
    e.printStackTrace();
    // or throw something that can be handled 
    // by the code calling your DAO
    throw new RuntimeException(e); 
}

已更改的内容包括:

  • 代码现在使用try-with-resources,这样即使抛出异常,可调用语句也能正确关闭。
  • 执行语句时可能引发的SQLExceptions 现在已记录在案,并且该异常不会被忽视

【讨论】:

  • 是的。我将所有提到的代码都保存在 try catch 块中。我的代码存在提交问题。事务无法提交,它处于自动提交模式,我试图再次提交。谢谢你的解决方案..它也可以工作..
  • @Alok,也许您可​​以写一个简短的答案来描述解决方案并将其标记为已接受。
猜你喜欢
  • 2019-08-20
  • 1970-01-01
  • 2015-04-20
  • 2019-06-06
  • 2014-04-22
  • 1970-01-01
  • 2021-03-02
  • 2012-10-11
  • 1970-01-01
相关资源
最近更新 更多