2015-05-07 13 views
0

我試圖在使用Java和SQLPlus的文件夾中執行一組SQL腳本。我的問題是,即使出現錯誤,我從SQL腳本獲取的返回碼始終爲0。這就是我要做的 -從SQLPlus捕獲Java中的錯誤代碼

StringBuffer command = new StringBuffer(); 
    String[] cmd = new String[3]; 
     cmd[0] = "cmd.exe"; 
     cmd[1] = "/C"; 
     cmd[2] = "echo WHENEVER SQLERROR EXIT 1 WHENEVER OSERROR EXIT 2 | sqlplus " + args[1] + "/" + args[2] + "@" + args[3] + "/" + args[4] + " " + fileName; 
     for (int i = 0; i < cmd.length; i++) { 
      command.append(cmd[i]); 
      command.append(" "); 
     } 
    Process p = Runtime.getRuntime().exec(command.toString()); 
    p.destroy(); 
    System.out.println("Exit value" + p.exitValue()); // Its always 0. 

所以最好我期待錯誤代碼1,因爲我已經使用WHENEVER SQLERROR EXIT 1。但是,我總是得到exitValue爲0。下面是其違反了PK約束腳本 -

INSERT INTO U_5837_F_6149_tbl VALUES ('E', 'B', 'Y'); 
INSERT INTO U_5837_F_6149_tbl VALUES ('E', 'M', 'Y'); 
INSERT INTO U_5837_F_6149_tbl VALUES ('E', 'M', 'Y'); 

編輯 - 如果我添加,WHENEVER SQLERROR EXIT 1 WHENEVER OSERROR EXIT 2我的腳本,它似乎很好地工作。是因爲我的返回值是從cmd.exe而不是sqlplus中獲取的。如果是的話,是否有反正我可以從SQL加到CMD的錯誤代碼,並從那裏拿?

+1

您應該更好地通過jdbc驅動程序執行查詢。 – Kai

+0

腳本可以定期更改,然後每次更改腳本以更改腳本似乎都不是一個好選擇。另外,由於我正在遍歷多個文件,我們可以添加更多的文件。這在擴展性方面更好,這似乎是唯一的問題 – Pratik

+0

你得到的「0」是來自「destroy()」。這不是分貝 –

回答

0

所以,最後我發現一個黑客到這整個問題。以下是我必須做的 - 1)我仍在遍歷目錄中的所有sql腳本,但不是直接執行它們,而是使用我正在迭代的腳本的文件位置調用另一個腳本(test.sql)作爲參數。腳本所做的就是調用所需的腳本來運行。這裏是我的TEST.SQL文件的內容 -

WHENEVER SQLERROR EXIT 999 
WHENEVER OSERROR EXIT 99 

prompt &1; 
START &1; 

& 1這裏代表則傳遞到這個TEST.SQL文件,它代表了我遍歷文件中的第一個參數。 START命令運行該文件,並且由於WHENEVER SQLERROR EXIT條件,我將正確的代碼返回給Java。