通过 JDBC 运行 PL/SQL 和 T-SQL

Posted

技术标签:

【中文标题】通过 JDBC 运行 PL/SQL 和 T-SQL【英文标题】:Running PL/SQL and T-SQL Through JDBC 【发布时间】:2016-01-13 12:46:26 【问题描述】:

我想知道通过 JDBC 运行 PL/SQL 或 T-SQL 代码块的最佳方式是什么。

更具体地说,应该使用什么 JDBC API 来执行返回 ResultSets 的 PL/SQL 或 T-SQL 块?

更新:

更具体地说 - 我有一个通用代码,它接收 SQL 代码(可能是 SQL、PL/SQL 或 T-SQL)作为输入,根据所需的数据库加载适当的 JDBC 驱动程序,并执行给定的 SQL 代码如下:

  Statement stmt = conn.createStatement (); 
  ResultSet rs = stmt.executeQuery("BEGIN some code END SELECT * FROM MY_TABLE");
  while (rs.next ()) 
     System.out.println (rset.getString (1));
  

当使用一些 T-SQL 或 PL/SQL 对象(例如游标)时,这不会返回 ResultSet

所以,我想知道这个 JDBC API 是否是执行此类查询的最佳方式。如果是这样,那么我正在使用的特定 JDBC 驱动程序实现中肯定存在错误。

【问题讨论】:

使用execute("your PL/SQL block here"),然后使用Statement.getResultSet()。检查JavaDocs,它甚至有一个例子 【参考方案1】:

CallableStatement 通常是要走的路。此链接给出了如何在 Oracle 中执行此操作的示例:

Using Cursor Variables

请注意,您得到的是Cursor,而不是ResultSet

在 T-SQL(我不太了解)中,CallableStatementexecuteQuery 应该可以按预期工作,请参阅此链接:

JDBC: CallableStatement

【讨论】:

谢谢@ammoQ。 CallableStatement 是否适用于纯 SQL 代码?我的查询是动态的,我不知道它的实际类型。 我不确定(你必须试一试),但规范说 CallableStatement 用于执行存储过程,所以我不希望它与普通 SQL 查询一起使用。结果可能取决于所使用的数据库系统和驱动程序。【参考方案2】:

您需要预先提供连接信息才能执行 SQL。您无法从 SQL 推断数据库。因此,我认为没有任何此类 API 可用于处理此类查询。

您可以使用标准的 JDBC API。来自here的例子:

import java.sql.*; 
import oracle.jdbc.pool.OracleDataSource;

class JdbcTest  
   public static void main (String args []) throws SQLException  
      // Create DataSource and connect to the local database
      OracleDataSource ods = new OracleDataSource();
      ods.setURL("jdbc:oracle:thin:@//myhost:1521/orcl");
      ods.setUser("scott");
      ods.setPassword("tiger");
      Connection conn = ods.getConnection();

      // Query the employee names 
      Statement stmt = conn.createStatement (); 
      ResultSet rset = stmt.executeQuery ("SELECT ename FROM emp");
      // Print the name out 
      while (rset.next ())
         System.out.println (rset.getString (1));

      //close the result set, statement, and the connection
      rset.close();
      stmt.close();
      conn.close();
    
 

【讨论】:

这适用于普通 SQL,但似乎不支持所有 T-SQL 操作。 @zuckermanori:- 是的,你能更具体地说明你想要实现的目标吗?您可以参考this 了解如何使用 JDBC 连接到 mysql @zuckermanori:- 如果我理解正确,那么您正在寻找的是来自 SQL 查询的数据库信息,这是不可能的,因此我认为不存在任何此类 API。 (请纠正我,我误解了它 你误会了。我有数据库信息。我想要的是运行返回结果的动态 SQL 代码(可能是 SQL、PL/SQL 或 T-SQL),并读取这些结果。

以上是关于通过 JDBC 运行 PL/SQL 和 T-SQL的主要内容,如果未能解决你的问题,请参考以下文章

SQL 非过程性语言 T-SQL PL/SQL 过程性语言;区别是啥?

如何像在 T-SQL 中一样在 PL/SQL 中声明和使用变量?

如何通过 JDBC 调用返回 UDO 并解释该结果的 PL/SQL 函数?

JDBC + PL/SQL = 这么简单,还是有啥陷阱?

在 PL/SQL Oracle 中需要此 T-Sql 函数的等效函数。如果有其他解决方案,那么流水线

Oracle 存储过程