Лучше ли зацикливаться на SQL или PHP здесь

Java exec не может запускать такие командные команды. Если вы хотите запустить команду оболочки, вам нужно явно вызвать оболочку; например,

Process proc = run.exec(new String[]{"/bin/sh", "-c", "echo 5 | ./prog"});

Для получения более подробной информации о том, что делает Java с этим, прочитайте javadocs для exec(String) и exec(String[]) . Обратите внимание, что это «методы удобства», и вам нужно следовать цепочке ссылок на основные методы для полного понимания того, что говорит javadoc.

Если вы хотите получить более подробную информацию о том, как обрабатываются Java это, есть исходный код ...

Если вы хотите глубже понять, почему Java не не обрабатывает сам синтаксис оболочки, вам, вероятно, необходимо пройти глубокое погружение в архитектуру и философию систем UNIX / Linux и разделение проблем между приложением, операционной системой и командной оболочкой. Обратите внимание, что существуют разные разные оболочки, каждая из которых имеет (потенциально) разные правила для цитирования, разделения аргументов, перенаправления, труб и т. Д.

Объяснение решения:

  • Причиной разделения команды вручную является то, что exec(String) не будет разделять команду на на одну команду и аргументы правильно. Это невозможно. Это пример, когда в конвейере есть две команды .
  • Причина использования «sh» - это ... ну ... вам нужна оболочка для синтаксического анализа и обработки командной строки оболочки. Команда exec Java не поддерживает синтаксис оболочки ... как объясняет javadoc.
  • Назначение опции «-c» объясняется «man sh». В принципе, sh -c "a b c" означает «использовать« sh »для запуска командной строки« ab c ».

FWIW, технически возможно построить и запустить конвейер исключительно на Java (т.е. не полагаясь на внешнюю оболочку), но, как правило, не стоит усилий. Вы уже ввели зависимость от платформы, запустив внешние команды, поэтому дополнительная зависимость в форме конкретной команды и синтаксиса оболочки не делает вещи значительно хуже.

-1
задан Rolf Wolf 6 March 2019 в 09:11
поделиться

1 ответ

Вы можете использовать простое INSERT INTO ... SELECT в этом случае:

INSERT INTO usevoucher (userID, voucherID)
    SELECT userID, voucherID 
    FROM users 
    WHERE (<your-conditions>) AND voucherID IN (5, 6, 7, 8, ...)

Решение, основанное на вашем редактировании:

INSERT INTO ownsvoucher (userID, voucherID)
  SELECT users.userID, vouchers.voucherID 
  FROM (users, vouchers) 
    LEFT JOIN ownsvoucher ov ON ov.userID = users.userID AND ov.voucherID = vouchers.voucherID 
  WHERE vouchers.active = 1 AND ov.voucherID IS NULL

В случае, если вы хотите Фильтр для конкретных voucherID можно добавить AND vouchers.voucherID IN (5, 6).

демо на dbfiddle.uk

0
ответ дан Sebastian Brosch 6 March 2019 в 09:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: