MySQL - использование подготовленного оператора для копирования строки в той же таблице и включения значений c выдает ошибку - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь использовать подготовленный оператор для копирования одной строки в новую строку (INSERT) в той же таблице и включения некоторых значений c. Однако я получаю следующую ошибку:

SQLException in copyProgram: java.sql.SQLException: Operand should contain 1 column(s)

Мой ввод:

prId: 4 accountID: 50 newFromDate: 2020-04-27 newToDate: 2020-04-28

Мой код:

    String insertQry = ("INSERT INTO at_program "
            + "(acc_id, pr_name, pr_start_date, pr_start_time, pr_end_date, pr_end_time, "
            + "pr_cost_pp, pr_woodbeads, pr_special, pr_joeys, pr_cubs, "
            + "pr_scouts, pr_venturers, pr_rovers, pr_leaders, pr_family, "
            + "pr_swimming, pr_pioneering, pr_archery, pr_canoe, pr_bushwalking, "
            + "pr_4wd, pr_abseiling, pr_snorkelling, pr_boating, "
            + "pr_rock_climbing, pr_caving, pr_branch_instructions, pr_policies_information, "
            + "pr_whs, pr_other, pr_notes) "
            + " (SELECT (?, pr_name, ?, pr_start_time, ?, pr_end_time, "
                    + "pr_cost_pp, pr_woodbeads, pr_special, pr_joeys, pr_cubs, "
                    + "pr_scouts, pr_venturers, pr_rovers, pr_leaders, pr_family, "
                    + "pr_swimming, pr_pioneering, pr_archery, pr_canoe, pr_bushwalking, "
                    + "pr_4wd, pr_abseiling, pr_snorkelling, pr_boating, "
                    + "pr_rock_climbing, pr_caving, pr_branch_instructions, pr_policies_information, "
                    + "pr_whs, pr_other, pr_notes) "
            + " FROM at_program "
            + " WHERE pr_id = ?);"); 

 ps = c.prepareStatement(insertQry, Statement.RETURN_GENERATED_KEYS);
            // Create a statement and execute the query on it               
            ps.setString(1, accountID);
            ps.setString(2, fromDate);
            ps.setString(3, toDate);
            ps.setString(4, prID);

            ps.executeUpdate();

1 Ответ

2 голосов
/ 27 апреля 2020

У вас есть параши вокруг списка полей в вашем SELECT! Удалите их.

Проблема в том, что SELECT ожидает список (отдельных) столбцов, но вы передаете значение из нескольких столбцов.

SELECT x, y, z видит x, y и z как три значения, каждое из которых состоит из одного столбца, но вы передаете SELECT (x, y, z), что интерпретируется как одно значение с тремя столбцами, отсюда и ошибка.

Кстати, парни вокруг всего SELECT также излишни, на этот раз, потому что INSERT INTO table (columns) SELECT ... является признанной синтаксической конструкцией самой по себе.

Исправленный код:

    String insertQry = ("INSERT INTO at_program "
            + "(acc_id, pr_name, pr_start_date, pr_start_time, pr_end_date, pr_end_time, "
            + "pr_cost_pp, pr_woodbeads, pr_special, pr_joeys, pr_cubs, "
            + "pr_scouts, pr_venturers, pr_rovers, pr_leaders, pr_family, "
            + "pr_swimming, pr_pioneering, pr_archery, pr_canoe, pr_bushwalking, "
            + "pr_4wd, pr_abseiling, pr_snorkelling, pr_boating, "
            + "pr_rock_climbing, pr_caving, pr_branch_instructions, pr_policies_information, "
            + "pr_whs, pr_other, pr_notes) "
            + " SELECT ?, pr_name, ?, pr_start_time, ?, pr_end_time, "
                    + "pr_cost_pp, pr_woodbeads, pr_special, pr_joeys, pr_cubs, "
                    + "pr_scouts, pr_venturers, pr_rovers, pr_leaders, pr_family, "
                    + "pr_swimming, pr_pioneering, pr_archery, pr_canoe, pr_bushwalking, "
                    + "pr_4wd, pr_abseiling, pr_snorkelling, pr_boating, "
                    + "pr_rock_climbing, pr_caving, pr_branch_instructions, pr_policies_information, "
                    + "pr_whs, pr_other, pr_notes "
            + " FROM at_program "
            + " WHERE pr_id = ?;");
...