PreparedStatement,using one parameter for multiple “?”

后端 未结 4 414
名媛妹妹
名媛妹妹 2021-01-24 13:08

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         


        
相关标签:
4条回答
  • 2021-01-24 14:01

    JDBC doesn't support named parameters, but Spring JDBC provides this functionality with NamedParameterJdbcTemplate

    0 讨论(0)
  • 2021-01-24 14:02

    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
    
    0 讨论(0)
  • 2021-01-24 14:08

    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 :pattern
    

    It 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);

    0 讨论(0)
  • 2021-01-24 14:14

    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
    
    0 讨论(0)
提交回复
热议问题