PreparedStatement, используя один параметр для нескольких «?» - PullRequest
0 голосов
/ 24 октября 2018

У меня есть вставка, если не существует запроса, как показано ниже.

BEGIN
    IF NOT EXISTS (SELECT * FROM tbl_sampleTable WHERE name = ? or subject = ?)
    BEGIN
        INSERT INTO tbl_sampleTable VALUES (?,?)
    END
END

Я выполняю вышеупомянутый запрос с JDBC PreparedStatement, как показано ниже

    pst.setString(1, name);
    pst.setString(2, subject);
    pst.setString(3, subject);
    pst.setString(4, name);
    pst.executeUpdate();

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

Редактировать: я не использую Spring или любой другой фреймворк, если это уместно.

Ответы [ 4 ]

0 голосов
/ 24 октября 2018

Полезный прием в этой ситуации - объявлять переменные.

Вы связываете значения с переменными только один раз и можете использовать их несколько раз в своем блоке PL / SQL.

DECLARE
  l_name tbl_sampleTable.name%TYPE := ?;
  l_subject tbl_sampleTable.subject%TYPE := ?;
BEGIN
    IF NOT EXISTS (SELECT * FROM tbl_sampleTable WHERE name = l_name  or subject = l_subject )
    BEGIN
        INSERT INTO tbl_sampleTable (name,subject)
        VALUES (l_name ,l_subject )
    END
END
0 голосов
/ 24 октября 2018

Вам нужно добавить какую-нибудь оболочку, без использования Spring (NamedParameterJdbcTemplate), которую вы можете попробовать другой как HTTP-RPC framework

Предоставлен класс org.httprpc.sql.Parametersс помощью инфраструктуры HTTP-RPC обеспечивает поддержку именованных параметров в JDBC.Метод parse () этого класса используется для создания экземпляра Parameters из JPA-подобного SQL-запроса;например:

SELECT * FROM user WHERE first_name LIKE :pattern or last_name LIKE :pattern

В качестве аргумента принимает строку или читатель, содержащий текст запроса:

 Parameters parameters = Parameters.parse(sqlReader);

Метод getSQL () класса Parameters возвращает обработанный запрос в стандартном формате.Синтаксис JDBC.Это значение может использоваться при вызове Connection # prepareStatement ():

PreparedStatement statement = connection.prepareStatement(parameters.getSQL());

Значения параметров указываются с помощью метода put ():

parameters.put("pattern", pattern);

Значения применяются коператор с помощью метода apply ():

parameters.apply (оператор);

0 голосов
/ 24 октября 2018

Как раз в этом случае вы можете использовать переменные SQL.Это не общее решение.А также многие специфические варианты SQL-вендоров знают такие конструкции вставки, когда не существует, не нуждаясь в таком архаичном коде.

BEGIN
    DECLARE @MyName varchar(100);
    DECLARE @MySubject varchar(100);
    SET @MyName = ?;
    SET @MySubject = ?;
    IF NOT EXISTS (SELECT * FROM tbl_sampleTable WHERE name = @MyName OR subject = @MySubject)
    BEGIN
        INSERT INTO tbl_sampleTable(subject, name) VALUES (@MySubject, @MyName)
    END
END
0 голосов
/ 24 октября 2018

JDBC не поддерживает именованные параметры, но Spring JDBC предоставляет эту функциональность с NamedParameterJdbcTemplate

...