Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jdbc中执行绑定变量的Sql查询_Java_Sql_Oracle_Jdbc - Fatal编程技术网

Java Jdbc中执行绑定变量的Sql查询

Java Jdbc中执行绑定变量的Sql查询,java,sql,oracle,jdbc,Java,Sql,Oracle,Jdbc,我有这样一个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" a

我有这样一个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
当我在OracleSQLDeveloper中运行上面的查询时,效果非常好。但当我使用上面的jdbc代码运行它时,它并不是抛出所有绑定变量的异常。
如何在JDBC中运行上述查询使用以下语法,
EMP.DNAME as DNAME1
。我指的是点和as必须在双引号内。

在执行下面的语句之前,变量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      
}
public executeQuery(字符串queryStr,映射参数){
//从queryStr创建connecitno和station的代码。
//将deptno绑定到一个值

对于(int i=0;i将查询中的
:deptno
替换为?)

使用以下语句代替实例化语句:

PreparedStatement stmt=con.prepareStatement(query);

stmt.setInt(1,deptno); //1 is for the first question mark
其中
deptno
保存要执行查询的值


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

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

使用OraclePreparedStatement及其方法

如果在这种情况下,您不知道有多少绑定变量,那么您必须在映射中捕获绑定变量,并准备一个列表并相应地进行设置


否则您的需求将无法实现!

从报告中动态获取查询

从这个查询中,我们需要拆分querystring以获得绑定变量的数量,并将这些绑定变量放置在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();
PreparedStatement prestmt=dbConnection.PreparedStatement(查询);
对于(int i=0;i


如果在这种情况下,我们不知道我们得到了多少绑定变量,那么这种方法对我来说是成功运行的。

张贴您得到plz的确切错误。张贴堆栈跟踪。张贴您拥有的所有代码plz。您在查询中有一个命名参数(:DeptNo),但您没有给它赋值。ORA-01008:并非所有变量都绑定。当我在Jdbc中运行高于sql的查询时,我会遇到此错误。我希望在Oracle sql developer中完美地运行高于Jdbc的查询,而不是在Jdbc中。但在运行时,我会得到更多的查询,甚至我不知道会有多少绑定变量be there.this method present setParameter()是否存在?setParameter不直接存在于PreparedStatement中。请查看并模仿该功能。@thiyaga如何编写Station.setParameter()呢@JqueryLearner,这只是一个编写的wapper方法。实际方法将是setInt或setString或SetObject等。我们可以编写一个名为setParameter的包装器方法,用于检查参数的类类型,并在准备的语句上使用相应的方法。运行时即使我不知道一个查询包含多少绑定变量有。您上面提到的查询只有一个绑定变量,即:deptno您不确定该查询吗?前面提到的一个示例查询,在运行时,我将获得更多数量的查询,其中可能包含多个绑定变量。我可以知道查询的来源吗?或者查询是如何生成的以及何时更改的?查询是gene根据报告进行评级,我们不知道它有多少绑定变量。根据报告,查询将更改。OraclePreparedStatement PRESMT=(OraclePreparedStatement)dbConnection.prepareStatement(查询);prestmt.setStringAtName(“DeptNo”,“DeptNo”);result=prestmt.execute(查询);//尝试设置SQL:DEPTNOPLES中未出现的参数名称。请打印查询字符串并确认绑定变量的名称。它区分大小写。
   bindkey = entry1.getKey().toString();
    String bindkeyreplace =":".concat(bindkey).trim();
    String bindkeyreplacestring = "?";
    query = query.replace(bindkeyreplace, bindkeyreplacestring);
        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();