Sql query with bind variables execution in Jdbc

前端 未结 5 1761
庸人自扰
庸人自扰 2021-01-15 17:28

I have a sql query like this.

 select \"DEPT\".\"DEPTNO\" as \"DEPTNO1\",
\"DEPT\".\"DNAME\" as \"DNAME1\",
\"DEPT\".\"LOC\" as \"LOC1\",
\"EMP\".\"COMM\" as         


        
相关标签:
5条回答
  • 2021-01-15 17:54

    Get the query dynamically from the report.

    From this query we need to split querystring to get number of bind variables and placing those bind variables in a HashMap.HashMap is like

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

    From this hashmap,need to replace the query bind variable with ?.For this we need to do like

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

    Then we will get dynamic query coming from the report with ? instead of :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();
    

    If in case, we don't know how many bind variables we get then this approach is running successfully for me.

    0 讨论(0)
  • 2021-01-15 17:55

    The variable DeptNo must be bound to a value before you execute the statement like below.

    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);    
    

    You must set values for all the variables in your prepared statement othwerise you cannot execute the statement. If you receive the query to execute itself as an input then you should also get the parameters and its values also as input. Something like below

    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      
    }
    
    0 讨论(0)
  • 2021-01-15 17:58

    You created a Query with bind variable and you never set it.

    Use OraclePreparedStatement and its method setStringAtName()

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

    If not OraclePreparedStatement, you can just put it as ?1 in your Query string and use,

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

    If in case, you don't know how many bind variables you get, you have capture the bind variables in a map and prepare a list and set it accordingly!

    Else your requirement is unachievable!

    0 讨论(0)
  • 2021-01-15 18:11

    Use this syntax,EMP.DNAME as DNAME1. I mean your dot and as must be inside the double quotes.

    0 讨论(0)
  • 2021-01-15 18:14

    replace :deptno in your query with a ?.

    and instead of instantiating statement use the following:

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

    where deptno holds the value for which you want to execute the query.

    Through PrepredStatement interface we can use parametrized query which is compiled only once and has performance advantage in comparison to the Statement interface.

    0 讨论(0)
提交回复
热议问题