
将参数传递给 select 语句的 in 子句.doc
5页将参数传递给 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.TRIPTYPEIDFROM TRAVEL.TRIPWHERE 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.TRIPTYPEIDFROM TRAVEL.TRIPWHERE TRAVEL.TRIP.PERSONID IN ( ?, ?, ?)请注意,IN 子句在圆括号内包含了三个参数占位符 (?),这表示在执行时需要为此特定查询传递三个参数 使用 Java Studio Creator 2 查询编辑器,您可以方便地将这些类型的查询结合在一起。
请右键单击查询编辑器网格窗格中的列以打开“添加查询条件”对话框将“比较”字段设置为下拉选项列表中的 IN,然后选择“参数”单选按钮,将条件设置为 ( ?, ?, ? )在完成该对话框后,网格窗格中的“条件”列将反映您所做的更改(请参见图 1)图 1:设置 IN 子句的参数您甚至可以通过查询编辑器测试此查询从图表窗格或 SQL 窗格弹出式菜单中选择“运行查询”因为查询现在包含一些参数,所以系统将打开“指定参数值”对话框,您可以在其中输入参数值在上面的示例中,对话框会提示您输入三个值您可以在查询编辑器的底部窗格中查看查询结果图 2 显示了将 PERSONID 设置为 1、4 和 5 来运行此参数化 SQL SELECT 语句时,查询编辑器中显示出的该语句及运行结果图 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 ( " ? ) " );}elsecriteria.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 valueString runTimeQuery = new String (designTimeQuery + criteria.toString() );try {getSessionBean1().getMyRowSet().setCommand(runTimeQuery);// note the index has to start with 1for (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 renderederror("Error while Executing Query with Parameters:"+e.getMessage());}技术文章 Sun Java Studio Creator 2 查询编辑器包含了有关查询编辑器的详细信息。
教程执行插入、更新和删除操作还包含了其他的相关信息最后,下面资源包含了有关 Java 数据库编程的详细信息更多的开发者资源有关面向开发者的更多技术提示、文章和专家建议,请访问 Sun Developer Network (SDN) 上的 Java Studio Creator 开发者资源: 。
