我有这样的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代码运行它时,它会抛出并非所有变量绑定异常。 如何在JDBC中运行以上查询
答案 0 :(得分:5)
使用?。
替换查询中的:deptno
而不是实例化语句使用以下内容:
PreparedStatement stmt=con.prepareStatement(query);
stmt.setInt(1,deptno); //1 is for the first question mark
其中deptno
包含您要执行查询的值。
通过PrepredStatement接口,我们可以使用仅编译一次的参数化查询,与Statement接口相比具有性能优势。
答案 1 :(得分:3)
您使用绑定变量创建了一个查询,但您从未设置它。
使用OraclePreparedStatement
及其方法setStringAtName()
statement.setStringAtName("DeptNo","<<your Value>>");
如果不是OraclePreparedStatement
,则可以将其作为?1
放入查询字符串中
并使用,
statement.setString(1,"<<your Value>>");
如果你不知道你获得了多少绑定变量,你可以在地图中捕获绑定变量并准备一个列表并相应地设置它!
否则您的要求无法实现!
答案 2 :(得分:0)
使用此语法EMP.DNAME as DNAME1
。我的意思是你的点,必须在双引号内。
答案 3 :(得分:-1)
在执行如下语句之前,必须将变量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 <returnType> executeQuery(String queryStr, Map<String,Object> params) {
//Code to create connecitno and statment from queryStr.
//Bind deptno to a value
for(int i=0;i<params.size(),i++) {
//Get entry set from map
statment.setParameter(entryset.getKey(),entryset.getValue());
}
result = statment.execute(query);
//return or work on the result
}
答案 4 :(得分:-2)
从报告中动态获取查询。
从这个查询中我们需要拆分查询字符串以获取绑定变量的数量,并将这些绑定变量放在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();
如果万一,我们不知道我们获得了多少绑定变量,那么这种方法对我来说是成功运行的。