I have a insert if not exists query as below.
BEGIN
IF NOT EXISTS (SELECT * FROM tbl_sampleTable WHERE name = ? or subject = ?)
BEGIN
INSERT INTO tbl_sampleTable VALUES (?,?)
END
END
I am executing the above query with JDBC PreparedStatement as below
pst.setString(1, name);
pst.setString(2, subject);
pst.setString(3, subject);
pst.setString(4, name);
pst.executeUpdate();
I am getting these name and subject as method parameters, is there anyway i can provide values for multiple "?" with same parameter as they are same, instead of mentioning them two times each.
Edit: I don't use spring or any other framework, if it is relevant.
JDBC doesn't support named parameters, but Spring JDBC provides this functionality with NamedParameterJdbcTemplate
Just in this case you might use SQL variables. It is not a general solution. And also many SQL vendor specific variants know such insert-when-not-exists constructs, not needing such archaic code.
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
You need to add some wrapper, without using Spring (NamedParameterJdbcTemplate) you can try other as HTTP-RPC framework
The org.httprpc.sql.Parameters class provided by the HTTP-RPC framework brings named parameter support to JDBC. The parse() method of this class is used to create a Parameters instance from a JPA-like SQL query; for example:
SELECT * FROM user WHERE first_name LIKE :pattern or last_name LIKE :patternIt takes a string or reader containing the query text as an argument:
Parameters parameters = Parameters.parse(sqlReader);The getSQL() method of the Parameters class returns the processed query in standard JDBC syntax. This value can be used in a call to Connection#prepareStatement():
PreparedStatement statement = connection.prepareStatement(parameters.getSQL());Parameter values are specified via the put() method:
parameters.put("pattern", pattern);The values are applied to the statement via the apply() method:
parameters.apply(statement);
Usefull trick in this situation is to declare variables.
You bind the values to the variables only once and you can use them several times in your PL/SQL block.
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
来源:https://stackoverflow.com/questions/52966813/preparedstatement-using-one-parameter-for-multiple