Bạn đang chuyển tất cả thông tin kết nối dưới dạng một giá trị duy nhất; tương đương với điều này từ một dòng lệnh:
sqlplus "sys as sysdba/[email protected]<connect_string>"
sẽ nhận được phản hồi tương tự khi in trợ giúp đăng nhập SQL * Plus. Bạn cũng đã đặt sai mật khẩu của mình nhưng nó không đi xa đến vậy. Từ một dòng lệnh, điều này sẽ hoạt động:
sqlplus "sys/tiger" "as" "[email protected]<connect_string>"
vì vậy bạn cần chuyển 5 đối số cho ProcessBuilder
, một cái gì đó như:
String sqlCmd = "sqlplus";
String arg1 = "sys/tiger";
String arg2 = "as";
String arg3 = "[email protected](DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=hostname)(Port=PORT ID))(CONNECT_DATA=(SID=SID)))";
String arg4 = fileName;
...
ProcessBuilder pb = new ProcessBuilder(sqlCmd, arg1, arg2, arg3, arg4);
Điều này sẽ vẫn chỉ hoạt động nếu môi trường của bạn được định cấu hình để cho phép kết nối từ xa dưới dạng sysdba
. Làm bất cứ điều gì với tư cách sys
sẽ rất hiếm và có một tập lệnh bạn muốn chạy dưới dạng sys
có vẻ đủ bất thường để trình bao bọc Java có vẻ như quá mức cần thiết - và làm cho nó có vẻ như bạn có thể kết nối dưới dạng sys
thường xuyên, đó không phải là một ý tưởng hay - nhưng có thể đây chỉ là một bài tập học tập.