跳至内容 Java Solaris 社区 Sun 商店 加入 SDN 我的个人档案 加入的益处
 
将参数传递给 SELECT 语句的 IN 子句
作者:Sanjay Dhamankar,2005 年 12 月  
通过使用 Sun Java Studio Creator 2 IDE 中的查询编辑器,您可以轻松地创建大量复杂的查询,其中包括那些带有参数化 IN 子句的查询。在某些情况下,您可能需要执行包含 IN 子句(带有参数或参数列表)的查询 SQL SELECT 语句。也就是说,您希望查询能够接受 IN 子句可利用的一个或一组参数。
 

例如,您可能需要构造一个从表中选取某些列的 SQL SELECT 语句,它使用 WHERE 子句将选择范围限定在与值列表中的特定列值(作为参数传递给查询)相匹配的列。如果要为样例 TRAVEL 数据库中的 TRIP 表构造此类查询,您可以使用以下 SELECT 语句,返回其标识符与 1、4 或 5 相匹配的人员的旅行情况:

SELECT ALL TRAVEL.TRIP.TRIPID,
	TRAVEL.TRIP.PERSONID,
	TRAVEL.TRIP.DEPDATE,
	TRAVEL.TRIP.DEPCITY,
	TRAVEL.TRIP.DESTCITY,
	TRAVEL.TRIP.TRIPTYPEID
	FROM TRAVEL.TRIP
WHERE TRAVEL.TRIP.PERSONID  IN   ( 1,4,5 )

但是,您需要将这些值(1,4,5)作为参数进行传递,而不是对它们进行硬编码。

您可以使用 Java Studio Creator 2 查询编辑器来构造一些 SELECT 语句,它们将参数作为 IN 子句的一部分进行处理。本技术提示说明了如何完成此类操作,您甚至可以事先不了解查询所需的参数数量。

让我们从比较简单的示例入手。如果您在设计查询时已知晓参数的数量,则在设置 IN 子句时,其参数数量应当是执行查询时所需的参数数量。SELECT 语句中的每个参数都使用问号 (?) 占位符来表示。例如,可以按照以下方式更改上面的 SELECT 语句,使之可以接受 IN 子句的参数。

SELECT ALL TRAVEL.TRIP.TRIPID,
	TRAVEL.TRIP.PERSONID,
	TRAVEL.TRIP.DEPDATE,
	TRAVEL.TRIP.DEPCITY,
	TRAVEL.TRIP.DESTCITY,
	TRAVEL.TRIP.TRIPTYPEID
	FROM TRAVEL.TRIP
WHERE TRAVEL.TRIP.PERSONID  IN (?,?,?)

请注意,IN 子句在圆括号内包含了三个参数占位符 (?),这表示在执行时需要为此特定查询传递三个参数。

使用 Java Studio Creator 2 查询编辑器,您可以方便地将这些类型的查询结合在一起。请右键单击查询编辑器网格窗格中的列以打开“添加查询条件”对话框。将“比较”字段设置为下拉选项列表中的 IN,然后选择“参数”单选按钮,将条件设置为 (?,?,?)。在完成该对话框后,网格窗格中的“条件”列将会反映您所做的更改(请参见图 1)。

图 1:设置 IN 子句的参数
图 1:设置 IN 子句的参数
 

您甚至可以通过查询编辑器测试此查询。从图表窗格或 SQL 窗格弹出式菜单中选择“运行查询”。因为查询现在包含一些参数,所以系统将打开“指定参数值”对话框,您可以在其中输入参数值。在上面的示例中,对话框会提示您输入三个值。您可以在查询编辑器的底部窗格中查看查询结果。图 2 显示了将 PERSONID 设置为 1、4 和 5 来运行此参数化 SQL SELECT 语句时,查询编辑器中显示出的该语句及运行结果。

图 2:带有参数化 IN 子句的查询
图 2:带有参数化 IN 子句的查询
 

截至目前,您已指定并设置了查询。现在,我们需要在应用程序中添加代码,这样在调用查询时,应用程序会将参数值传递给 SELECT 语句。为此,应用程序需要在查询行集上调用 setObject 方法。setObject 方法将在运行时设置这些参数值。请参阅相关的行集文档和 API

如果在设计查询时并不知道所需的参数数量,则必须在运行时创建包含 "?" 占位符的查询,这些占位符的数量取决于所需的参数数量。动态创建查询后,请使用上述 setObject 方法来动态设置每个参数值。

在应用程序中实现此操作时,您会发现以下代码示例非常有用。请记住,您只能将此代码作为一种指导,因为它尚未经过测试,甚至也未进行编译。

代码示例 1
StringBuffer criteria = new StringBuffer();
for (int i=0; i< numberOfParameters; i++) {
	if (i == 0 ) {
		criteria.append ( " WHERE TRAVEL.TRIP.PERSONID IN ( ?, " );
	}
	else if (i == (numberOfParameters-1)) {
		criteria.append ( " ? ) " );
	}
	else
		criteria.append ( " ?, " );
}
String designTimeQuery = new String (
		"SELECT ALL TRAVEL.TRIP.TRIPID, " +
			"TRAVEL.TRIP.PERSONID, " +
			"TRAVEL.TRIP.DEPDATE, " +
			"TRAVEL.TRIP.DEPCITY, " +
			"TRAVEL.TRIP.DESTCITY, " +
			"TRAVEL.TRIP.TRIPTYPEID " +
		"FROM TRAVEL.TRIP " ); // save this constant value
String runTimeQuery = new String (designTimeQuery + criteria.toString() );
try {
	getSessionBean1().getMyRowSet().setCommand(runTimeQuery);
	// note the index has to start with 1
	for (int i=1; i<= numberOfParameters; i++) {
		getSessionBean1().getMyRowSet().setObject (i, yourParameter[i-1]);
	}
	getSessionBean1().getMyRowSet().execute();
} catch (Exception e) {
	// Send the error to a Message Component on the web page rendered
	error("Error while Executing Query with Parameters:"+
		e.getMessage());
}
 

技术文章 Sun Java Studio Creator 2 查询编辑器包含了有关查询编辑器的详细信息。

教程执行插入、更新和删除操作还包含了其他的相关信息。

最后,下面的资源包含了有关 Java 数据库编程的详细信息。

更多的开发者资源

有关为开发者提供的更多技术提示、文章和专家建议,请访问 Sun Developer Network (SDN) 上的 Java Studio Creator 开发者资源,网址为 http://gceclub.sun.com.cn/prodtech/javatools/jscreator/