通过 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 来执行返回 ResultSet
s 的 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(我不太了解)中,CallableStatement
和 executeQuery
应该可以按预期工作,请参阅此链接:
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 函数?