Вы правы. Это скалярный подзапрос . Такой подзапрос возвращает один столбец и не более одной строки. Значение рассматривается как скалярное значение в запросе.
В данном случае это запрос агрегации, в котором учитываются совпадающие строки. Итак, эта логика требует как минимум двух совпадений.
Вероятно то, что просто необходимо считать stdout и stderr процесса, или он зависнет, так как его буфер вывода полон. Это является самым легким при перенаправлении stderr к stdout, только для сейфа:
public static void main(String[] args) throws IOException,
InterruptedException {
String[] cmd = new String[] { "cmd.exe", "/C", "dir", "2>&1" };
Process process = Runtime.getRuntime().exec(cmd);
InputStream stdout = process.getInputStream();
while( stdout.read() >= 0 ) { ; }
process.waitFor();
}
}
См. эту ссылку для объяснения.
Необходимо считать входной поток. Также процесс Java не работает как оболочка DOS. Необходимо передать аргументы сами:
String[] cmd = new String[3];
cmd[0] = "cmd.exe" ;
cmd[1] = "/C" ;
cmd[2] = "dir";
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(cmd);
Необходимо попытаться использовать a ProcessBuilder
как показано ниже. Не уверенный, что отличается, но это решило МНОГО проблем для нас.
ProcessBuilder pb = new ProcessBuilder(CMD, ARG1, ARG2);
Process p = pb.start();