Как правильно создать sql запрос (строку) для PreparedStatement со значениями, которые повторяются в запросе? - PullRequest
0 голосов
/ 10 марта 2020

У меня такой запрос

BEGIN IF NOT EXISTS (
    SELECT * FROM some_table with(nolock) 
    WHERE col_1 = ? and col_2 = ? and col_3 = ?)
    BEGIN
        INSERT INTO some_table (col_1, col_2, col_3, col_4, col_5, col_6,
            col_7, col_8, col_9, col_10, col_11, col_12, cdate) 
        VALUES
        (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, convert(date, GETDATE()))
    END
    ELSE
    BEGIN 
    UPDATE some_table 
        SET col_4 = col_4 + ?,
            col_5 = col_5 + ?,
            col_6 = col_6 + ?,
            col_7 = col_7 + ?,
            col_8 = col_8 + ?,
            col_9 = col_9 + ?,
            col_10 = col_10 + ?,
            col_11 = ?
        WHERE col_1 = ? and col_2 = ? and col_3 = ?
    END
END

И из-за некоторых требований я должен сохранить это Query в String, что для меня уже очень больно. Но для этого я создал PreparedStatement, который выглядит следующим образом:

PreparedStatement preparedStatemnt = conn.prepareCall(sqlQuery)) {
preparedStatemnt.setInt(1, value1);
preparedStatemnt.setString(2, value2);
preparedStatemnt.setString(3, value3);

preparedStatemnt.setInt(4, value1);
preparedStatemnt.setString(5, value2);
preparedStatemnt.setString(6, value3);
preparedStatemnt.setInt(7, value4);
preparedStatemnt.setInt(8, value5);
preparedStatemnt.setInt(9, value6);
preparedStatemnt.setInt(10, value7);
preparedStatemnt.setInt(11, value8);
preparedStatemnt.setInt(12, value9);
preparedStatemnt.setInt(13, value10);
preparedStatemnt.setInt(14, value11);
preparedStatemnt.setString(15, value12);

preparedStatemnt.setInt(16, value4);
preparedStatemnt.setInt(17, value5);
preparedStatemnt.setInt(18, value6);
preparedStatemnt.setInt(19, value7);
preparedStatemnt.setInt(20, value8);
preparedStatemnt.setInt(21, value9);
preparedStatemnt.setInt(22, value10);
preparedStatemnt.setInt(23, valye11);
preparedStatemnt.setInt(24, value1);
preparedStatemnt.setString(25, value2);
preparedStatemnt.setString(26, value3);

, как вы можете видеть здесь значение, которое я должен указать, может быть повторено, и я предпочел бы избежать этого, но я не знаю, есть ли какая-либо возможность.

И вот мой вопрос, есть ли способ создать эти утверждения таким образом, как String.fromat работает, я имею в виду

String.format("%1s, %1s, %1s, %1s", value1); // so the First(1) value is putted into all 4 places

Я думал о используя String.format для их создания, но я почти уверен, что это не безопасно, не так ли? Или, может быть, кто-то может дать мне другое предложение, как работать с таким утверждением, это было бы очень полезно, потому что у меня есть много подобных запросов, которые я должен создать.

Ps. Я не могу использовать хранимые процедуры.

...