2015-05-28 9 views
5

tôi đi qua một tham số để một PreparedStatement như thế này:Sử dụng lại một tham số trong PreparedStatement?

public void getNodes(String runId, File file, Connection conn) { 
    PreparedStatement ps = null; 
    ResultSet rs = null; 
    try { 
     ps = conn.prepareStatement(Mat.queries.get("NettingNode.QUERY")); 

     ps.setString(1, runId); 
     ps.setFetchSize(10000); 
     rs = ps.executeQuery(); 

     // etc. 
    } catch (Exception e) { 
     logger.error(e, e); 
    } finally { 
     close(rs, ps); 
    } 
} 

Và các truy vấn như sau:

select * from table_1 where run_id = ? 

Bây giờ tôi muốn thay đổi truy vấn của tôi như thế này, và tái sử dụng các tham số đầu tiên (cả ? sẽ sử dụng tham số runId):

select * from table_1 where run_id = ? 
union 
select * from table_2 where run_id = ? 

là có thể không làm điều này:

ps.setString(1, runId); 
ps.setString(2, runId); 
+0

Tắt chủ đề: Trong trường hợp C/C++ có thể. Hàm OCIDefineByPos, OCIDefineByName hoạt động như mong đợi. Tôi nghĩ rằng trong trường hợp JDBC tính năng này đã được hy sinh để tương thích với cơ sở dữ liệu, mà không hỗ trợ nó. Vì vậy, có lẽ các trình điều khiển Oracle JDBC có một số phần mở rộng độc quyền cho nó. – ibre5041

Trả lời

8

Điều này không thể thực hiện với JDBC thuần túy. Thay vào đó, bạn có thể sử dụng JDBCTemplate của Spring, nó sẽ hỗ trợ những gì bạn muốn với các tham số có tên, và sử dụng lại cùng một tên bất cứ nơi nào nó cần trong câu lệnh.

Xem Named parameters in JDBC

Các vấn đề liên quan