2010-07-29 49 views
10

Tôi muốn thực hiện một cái gì đó như thế này trên máy chủ MySQL của tôi:Tôi có thể sử dụng nhiều câu lệnh trong truy vấn được chuẩn bị JDBC không?

SET @id=(SELECT id FROM lookupTable WHERE field=?); 
(SELECT * FROM table2 WHERE [email protected]) 
UNION 
(SELECT * FROM table3 WHERE [email protected]) 
UNION 
(SELECT * FROM table4 WHERE [email protected]); 

này hoạt động tốt từ giao diện điều khiển, nhưng không phải từ Java PreparedStatement tôi. Nó ném một ngoại lệ với một lỗi cú pháp tại ';' tách các câu lệnh. Tôi thích biến vì tôi không phải lặp lại điều khoản tra cứu, nhưng tôi có thể viết lại nó nếu cần. JOIN tương đương cũng hơi khó xử với mệnh đề UNION.

Cảm ơn,

Joshua

+0

Như @ddimitrov nói, điều này dường như không thể trực tiếp. Tôi đã không thử 'PreparedStatement.addBatch()'. Một thủ tục lưu trữ có khả năng sẽ làm việc cho điều này quá. –

+0

Nếu bạn quan tâm đến các nhà cung cấp khác, thì Cơ sở dữ liệu CUBRID hỗ trợ tính năng này. Xem bài đăng trên diễn đàn này http://www.cubrid.org/forum/534638. – Eye

Trả lời

5

JDBC chưa bao giờ hỗ trợ phân tích cú pháp các truy vấn được phân tách. Mỗi lời gọi là một chuyến đi đến cơ sở dữ liệu. Có lẽ bạn có thể đạt được những gì bạn có nghĩa là để làm PreparedStatement.addBatch() cho mỗi truy vấn riêng biệt, sau đó thực hiện và lấy hai resultsets?

2

Chỉ cần chạy này là hai truy vấn riêng biệt (trong vòng một kết nối) sẽ cho bạn kết quả tương tự.

+0

Tôi đã hy vọng tránh được thời gian mạng hai lần, nhưng có vẻ như không thể tránh khỏi ở đây. Có lẽ đây là một tính năng bảo mật để tránh SQL injection. –

+1

@Joshua, bạn có thể truy vấn hàng loạt vào máy chủ và tránh các chuyến đi nhiều mạng. – ddimitrov

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