【问题标题】:How can I execute non-query Stored Procedure in JDBC如何在 JDBC 中执行非查询存储过程
【发布时间】:2012-12-26 05:29:32
【问题描述】:

我在 postgres 数据库中有一个存储过程。我正在使用postgres JDBC驱动程序执行存储过程,并且我不关心返回类型,并且无法执行查询。说明函数名附近有语法错误。

在返回行的过程中,我已经能够通过 PreparedStatement 和设置参数来做到这一点,例如:

PreparedStatement prepared = connection.prepareStatement("SELECT * FROM NonQueryProcedure(?)");
prepared.setInt(1, 999);
// ....
ResulSet resultSet = prepared.executeQuery();

但是,我似乎无法让它适用于我不关心返回类型的“更新”存储过程。我试过使用connection.prepareStatement()和prepareCall(),也试过用statement.execute()、.executeUpdate()和.executeQuery()执行,没有成功。

如何在不关心返回类型的情况下执行存储过程?

【问题讨论】:

  • .execute() 应该可以解决问题。也许您的 SQL 无效。我们能看到吗?
  • 我已经通过 postgres shell 成功运行了该过程。您是否建议将 .execute() 与 .prepareStatement() 一起使用? statement = connection.prepareStatement("nonQueryProcedure1(?)");语句.执行();。不起作用。
  • 如果我将准备好的语句创建为:PreparedStatement Prepared = connection.prepareStatement("SELECT nonQueryProcedure1(?)");也必须在命令行上执行此操作。不知道为什么。不熟悉该 SQL 语法。也许它是特定于 postgres 的?
  • PostgreSQL 本身没有存储过程,只有函数。走{call nonQueryProcedure1 ? } 路线可能会自动将其包装在一个 SELECT 中以执行它,就好像它是一个一样,不确定。
  • 只要使用execute("select NonQueryProcedure(?)");

标签: java postgresql jdbc


【解决方案1】:

如果没有实际的语法错误,我不能肯定,但试试这个:

"SELECT * FROM \"getData\"(?)"

CamelCase/PascalCase 在任何 SQL 数据库中都是一个坏主意。要么将它折叠成一个单独的大小写,你看到的只是 AMASSOFUNREADABLELETTERS,要么它需要引用,并且你必须永远输入“aMassofLettersAndQuotesAndShiftKeysAndMyFingersHurt”以避免语法错误。

【讨论】:

    【解决方案2】:

    由于 PostgreSQL 没有“真正的”过程,函数只是使用 SELECT 语句执行:

    statement.execute("select NonQueryProcedure(?)");
    

    请注意,在 PL/pgSQL 函数中,您可以使用 perform 语句来调用这样的函数。但这在 PL/pgSQL 块之外不可用。

    【讨论】:

      猜你喜欢
      • 2013-01-08
      • 2020-04-04
      • 2011-10-20
      • 2011-12-14
      • 2013-03-12
      • 1970-01-01
      • 2015-11-20
      • 1970-01-01
      • 2011-09-17
      相关资源
      最近更新 更多