2013-11-26 40 views
0

我有以下代碼,它似乎不工作。Java上的PL SQL似乎被卡住

CallableStatement cs = dbc.prepareCall("" + 
        "DECLARE " + 
        "transno numeric (9,0); " + 
        "jobno numeric (9,0); " + 
        "supcost numeric (9,0); " + 
        "message varchar (20) := 'All good'; " + 
        "BEGIN " + 
        "transno := ?; " + 
        "jobno := ?; " + 
        "supcost := ?; " + 
        "INSERT INTO JOB_TRANSACTION" + 
        " VALUES (transno, jobno); " + 
        "INSERT INTO TRANSACTION " + 
        " VALUES (transno, supcost); " + 
        "UPDATE ASSEMBLY_ACC ac" + 
        " SET cost = cost + supcost " + 
        " WHERE EXISTS(SELECT * FROM Manufacturing m WHERE m.job_no = jobno and m.assembly_id = ac.assembly_id); " + 
        "? := message; " + 
        "END;"); 
      cs.setInt(1, Integer.parseInt(trans_no)); 
      cs.setInt(2, Integer.parseInt(job_no)); 
      cs.setInt(3, Integer.parseInt(sup_cost)); 
      cs.registerOutParameter(4, Types.VARCHAR); 
      cs.execute(); 
      System.out.println(cs.getString(4)); 

其中,trans_no,job_no和sup_cost都是已包含值的字符串。

我認爲它在UPDATE語句中卡住了,但是我想不出用另一種方式來表達條件。

我打算做的是,每一個與它相應的電源成本sup_cost交易是由時間,它會同時更新cost三個賬戶,其中之一是Assembly_Acc (acc_no, assembly_id, cost)(爲簡單起見,我們將與一個工作),並且爲了知道哪個Assembly_Acc要更新,我們查找表Manufacturing (job_no, assembly_id, etc..)assembly_idjob_no(查詢中的jobno),這是一個主鍵,我們已經從頭開始計算。一旦assembly_id被發現,它會被用來之間辨別所有Assembly_Acc(這恰好有一個獨特的assembly_id

我希望這不會聽起來複雜,但你能不能幫我做的更好?我真的很緊迫,我不知道如何遵循。

+0

你檢查你的SQL語句seperatly,以確保它們是正確的,你想要做什麼? – Armunin

+0

我沒有單獨檢查更新語句,但其他兩個工作正常。數據庫中有很多關鍵參考,所以也有點困難。 – Yokhen

+0

如果你說,沒有更新聲明,所有工作正常,我會建議確保你的更新聲明正在工作。不確定'cost = cost + supcost'是否有效。可能是像'成本=(選擇XY的成本)+ supcost' – Armunin

回答

1

您的PL/SQL代碼應該放入存儲過程中,然後Java CallableStatement會調用該過程傳遞transno,jobno和supcost作爲參數。

看到這個問題: PreparedStatements or callableStatements

+0

謝謝,雖然我沒有得到所有我讀的,我試了一下,它解決了這個問題。 – Yokhen