弹簧& plsql存储过程-异常处理&交易

发布于 2024-10-03 17:12:25 字数 377 浏览 3 评论 0原文

我需要从 spring (通过 Hibernate)调用 oracle 存储过程。

我对 PL/SQL 不熟悉,所以我想知道如何继续。

1)我可以使用spring/hibernate(例如注释)来开始/关闭事务吗?我认为这不是问题,并且我不必在存储过程中开始/关闭。

2)在上述过程中,我打开和关闭游标,但如果出现异常,我想关闭它并向Java部分重新抛出异常,所以这就是我所做的:

EXCEPTION
  WHEN OTHERS THEN
   CLOSE my_cursor; 
   RAISE e_cannot_do_sth;

我想引发异常,这样我就可以让用户知道出了问题...

最好的方法是什么?

I need to call oracle stored procedure from spring (via Hibernate).

I'm not familiar with PL/SQL so I would like to know how to proceed with that.

1) Can I use spring/hibernate (for instance annotations) to begin/close transaction. I assume that it's not an issue and I don't have to begin/close inside stored procedure.

2) In the mentioned procedure I'm opening and closing the cursor but in case of exception I would like to close it and rethrow an exception to Java part, so here's what I've done:

EXCEPTION
  WHEN OTHERS THEN
   CLOSE my_cursor; 
   RAISE e_cannot_do_sth;

I want to raise an exception so I could let user know that something went wrong...

What is the best way to do it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

烟柳画桥 2024-10-10 17:12:25
  1. 是的,您可以使用 Spring 来管理事务。我不认为 Hibernate 会给你带来太多优势。

  2. 要引发异常,请使用以下命令:

    raise_application_error(errno, '您选择的错误消息');

其中 errno 是 -20000 到 -20999 之间的数字。然后在您的 Java 代码中,捕获 org.springframework.jdbc.UncategorizedSQLException,如下所示提取根 SQLExcection:

private SQLException digOutSqlException(UncategorizedSQLException t) {
  Throwable root = t;
  while (root.getCause() instanceof SQLException) {
    return (SQLException)root.getCause();
  }
  return null;
}

并在 SQLException 上调用 getErrorCode() 以获取自定义错误 PL/SQL 错误号。

  1. Yes you can use Spring do manage the transactions. I don't think Hibernate will give you much of an edge here.

  2. To throw an exception, use the following:

    raise_application_error(errno, 'Error Message of your choice');

Where errno is a number between -20000 and -20999. Then in your Java code, catch the org.springframework.jdbc.UncategorizedSQLException, pull out the root SQLExcection as follows:

private SQLException digOutSqlException(UncategorizedSQLException t) {
  Throwable root = t;
  while (root.getCause() instanceof SQLException) {
    return (SQLException)root.getCause();
  }
  return null;
}

And call getErrorCode() on the SQLException to get your custom error PL/SQL error number.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文