我試圖在使用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的錯誤代碼,並從那裏拿?
您應該更好地通過jdbc驅動程序執行查詢。 – Kai
腳本可以定期更改,然後每次更改腳本以更改腳本似乎都不是一個好選擇。另外,由於我正在遍歷多個文件,我們可以添加更多的文件。這在擴展性方面更好,這似乎是唯一的問題 – Pratik
你得到的「0」是來自「destroy()」。這不是分貝 –