在Jdbc中执行绑定变量的SQL查询

我有这样的SQL查询。

select "DEPT"."DEPTNO" as "DEPTNO1", "DEPT"."DNAME" as "DNAME1", "DEPT"."LOC" as "LOC1", "EMP"."COMM" as "COMM1", "EMP"."EMPNO" as "EMPNO1", "EMP"."ENAME" as "ENAME1", "EMP"."HIREDATE" as "HIREDATE1", "EMP"."JOB" as "JOB1", "EMP"."MGR" as "MGR1", "EMP"."SAL" as "SAL1" from "EMP" , "DEPT" where "DEPT"."DEPTNO" in (:DeptNo) 

//这是Jdbc代码

 Class.forName(DB_DRIVER); dbConnection = DriverManager.getConnection(DB_CONNECTION, DB_USER, DB_PASSWORD); Statement statment = dbConnection.createStatement(); result = statment.execute(query);//query is above sql query 

当我在Oracle上运行以上查询时,sql开发人员工作得很好。但是当我用上面的jdbc代码运行它时,它会抛出并非所有变量绑定exception。 如何在JDBC中运行上面的查询

用?替换你的查询中的:deptno

而不是实例化语句使用以下内容:

 PreparedStatement stmt=con.prepareStatement(query); stmt.setInt(1,deptno); //1 is for the first question mark 

其中deptno包含您要执行查询的值。

通过PrepredStatement接口,我们可以使用仅编译一次的参数化查询,与Statement接口相比具有性能优势。

您使用绑定变量创建了一个查询,但您从未设置它。

使用OraclePreparedStatement及其方法setStringAtName()

 statement.setStringAtName("DeptNo","<>"); 

如果不是OraclePreparedStatement ,你可以把它作为?1放在你的查询字符串中并使用,

 statement.setString(1,"<>"); 

如果你不知道你获得了多少绑定变量,你可以在地图中捕获绑定变量并准备一个列表并相应地设置它!

否则你的要求是无法实现的!

使用此语法, EMP.DNAME as DNAME1 。 我的意思是你的点,因为必须在双引号内。

在执行如下语句之前,必须将变量DeptNo绑定到一个值。

 DriverManager.getConnection(DB_CONNECTION, DB_USER, DB_PASSWORD); Statement statment = dbConnection.createStatement(); //Bind deptno to a value statment.setParameter("DeptNo",5); result = statment.execute(query); 

您必须为预准备语句中的所有变量设置值,否则您将无法执行该语句。 如果您收到查询以将自身作为输入执行,那么您还应该将参数及其值也作为输入。 像下面的东西

 public  executeQuery(String queryStr, Map params) { //Code to create connecitno and statment from queryStr. //Bind deptno to a value for(int i=0;i 

从报告中动态获取查询。

从这个查询我们需要拆分查询字符串以获取绑定变量的数量,并将这些绑定变量放在HashMap.HashMap中

  {DeptName =1, Job =1, DeptNo =1} 

从这个hashmap,需要用?替换查询绑定变量? 为此,我们需要这样做

  bindkey = entry1.getKey().toString(); String bindkeyreplace =":".concat(bindkey).trim(); String bindkeyreplacestring = "?"; query = query.replace(bindkeyreplace, bindkeyreplacestring); 

那么我们将从报告中得到动态查询? 而不是:bindvariable

  PreparedStatement prestmt = dbConnection.prepareStatement(query); for (int i = 0; i < bindParamMap.size(); i++) { prestmt.setInt(i + 1, 0);//Setting default value to check the query is running successfully or not } result = prestmt.execute(); 

如果以防万一,我们不知道我们获得了多少绑定变量,那么这种方法对我来说是成功运行的。