2013-12-16 87 views
0

我有一個像這樣的sql查詢。在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" 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 Developer查詢運行工作perfectly.But當我上面JDBC代碼運行它,它是投擲並不是所有的變量綁定異常。 如何在JDBC中運行以上查詢

+0

張貼確切的錯誤,你得到PLZ。張貼堆棧跟蹤。張貼你的所有代碼你有PLZ。 –

+1

您的查詢中有一個命名參數(:DeptNo),但您沒有爲其分配值。 – OldProgrammer

+0

ORA-01008:並非所有變量都綁定。我在JDBC上運行sql查詢時得到的這個錯誤 –

回答

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

如果在情況下,我們不知道有多少綁定變量我們那麼這個方法對我來說是成功運行的。

0

使用此語法,EMP.DNAME as DNAME1。我的意思是你的點和必須在雙引號內。

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

必須爲所有的變量在事先準備好的聲明othwerise你不能執行該語句設置的值。如果您收到查詢以將其自身作爲輸入執行,那麼您還應該將參數及其值作爲輸入。類似下面

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

現在這個方法setParameter()? – SpringLearner

+0

setParameter不直接存在於PreparedStatement中。看看http://stackoverflow.com/questions/2309970/named-parameters-in-jdbc和http://www.javaworld.com/article/2077706/core-java/named-parameters-for-preparedstatement。 html來模仿那個設施。 – thiyaga

4

在你的查詢與替換:deptno

,而不是實例化語句中使用以下和:

PreparedStatement stmt=con.prepareStatement(query); 

stmt.setInt(1,deptno); //1 is for the first question mark 

其中deptno適用於要執行查詢的值。

通過PrepredStatement接口,我們可以使用參數化查詢,它只編譯一次,並且與Statement接口相比具有性能優勢。

+0

運行時,即使我不知道查詢有多少個綁定變量。 –

+0

上面提到的查詢只有一個綁定變量,那就是:deptno 您不確定查詢嗎? – Vijay

+0

提到了一個示例查詢,在運行時我會得到更多的不。可能包含多個綁定變量的查詢 –

2

您創建了一個帶綁定變量的查詢,並且您從未設置它。

使用OraclePreparedStatement及其方法setStringAtName()

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

如果沒有OraclePreparedStatement,你可以把它當作?1在您的查詢字符串 和使用,

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

如果萬一,你不」 t知道你得到了多少個綁定變量,你已經捕獲了一個映射中的綁定變量,並準備一個列表並相應地設置它!

否則您的要求無法實現!

+0

OraclePreparedStatement prestmt = (OraclePreparedStatement)dbConnection。prepareStatement(查詢); prestmt.setStringAtName(「DeptNo」,「DeptNo」); result = prestmt.execute(query); // throwing嘗試設置SQL中未出現的參數名稱:DeptNo –

+0

請打印您的Query字符串並確認綁定變量的名稱。它區分大小寫。 –