Sql query with bind variables execution in Jdbc

35,994

Solution 1

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.

Solution 2

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.

Solution 3

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!

Share:
35,994
Obulesu Bukkana
Author by

Obulesu Bukkana

Updated on April 10, 2020

Comments

  • Obulesu Bukkana
    Obulesu Bukkana about 4 years

    I have a sql query like this.

     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)
    

    //This is the Jdbc code

    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
    

    When i run above query in Oracle sql developer works perfectly.But when i run it with above jdbc code it is throwing Not all variables bound exception. How to run above query in JDBC