2011-01-11 43 views
17

Làm cách nào để in ấn OracleCallableStatement này?làm thế nào để in Tuyên bố (CallableStatement) trong Java?

ocstmt = (OracleCallableStatement) connection.prepareCall("{?= call 
      package.method(id => ?, name=>?)}"); 
    ocstmt.registerOutParameter(1, OracleTypes.CURSOR);    
    ocstmt.setInt(2, obj.getId()); 
    ocstmt.setString(3, obj.getName()); 
    ocstmt.execute(); 
    resultSet = ocstmt.getCursor(1); 

Ý tôi là làm cách nào để biết truy vấn nào đến cơ sở dữ liệu, làm cách nào để in truy vấn? bởi vì đôi khi nó mang lại cho tôi lỗi như "Loại sai", đó là lý do tại sao tôi muốn xem truy vấn này

Trả lời

1

Bạn không thể lấy SQL bằng cách in Tuyên bố.

Ví dụ bạn đã đăng một trong những "đôi khi" gây ra lỗi?

Tại sao bạn phải xử lý trường hợp này với OracleCallableStatement? Phần nào của cuộc gọi không phải là CallableStatement tiêu chuẩn?

+0

Tôi cung cấp 10 phút gửi sai loại int thay vì gấp đôi. Đó là lý do tại sao tôi muốn nhận được sql trước khi thực hiện() nó –

+0

"* bạn không thể *" là không hoàn toàn chính xác. Nó phụ thuộc vào trình điều khiển JDBC cơ bản và do đó thực hiện thực tế của giao diện 'Statement'. Một số trình điều khiển để thực hiện một phương thức 'toString()' thích hợp, một số thì không. Tuy nhiên, Oracle không. –

+0

Tất cả những gì tôi thường sử dụng không xa như tôi biết (Oracle, MySQL, SQL Server, một số PostgreSQL). Bạn có thể đặt tên một số điều đó? – duffymo

0

Nói chung, hãy sử dụng myObject.toString() để xem nội dung được in. Bạn có thể hoặc không thể nhìn thấy truy vấn đầy đủ mặc dù. Nếu bạn không thể làm cho nó đi, điều đầu tiên mà tôi sẽ xem xét là tài liệu API (javadocs cho thư viện Oracle hoặc trình điều khiển mà bạn đang sử dụng)

+0

Tôi đã thử tất cả điều này.cảm ơn cho bình luận của bạn –

-1

Tôi không chắc chắn nếu tôi hiểu câu hỏi , nhưng nó có vẻ như bạn muốn thấy điều này:

String sql = "{?= call package.method(id => ?, name=>?)}"; 
    System.out.println(sql); 
    ocstmt = (OracleCallableStatement) connection.prepareCall(sql); 
    ... 
+0

cảm ơn cho bình luận của bạn. Tôi muốn in các truy vấn sql mà đi vào cơ sở dữ liệu với các giá trị. "Chèn vào các giá trị bảng ('a', 1, 11.23.2010)" –

+1

Xin chào, Bạn đã quản lý nó chưa? – rayman

-3

tôi nghĩ rằng nó có thể hữu ích nếu bạn đang tìm kiếm liệu truy vấn thực hiện có giá trị hay không

System.out.println("value : "+CallableStatement.execute()); 

tức Các "false" được trả về bởi " CallableStatement.execute() "có nghĩa là câu lệnh JDBC không đọc bất kỳ hàng nào, (vì vậy không có kết quả nào et để đọc). Đây là những gì bạn mong đợi, vì các thủ tục được lưu trữ không trả về trực tiếp ResultSets, chúng chỉ trả về các giá trị cho bất kỳ tham số OUT hoặc INOUT nào.

+0

Tôi không nghĩ rằng địa chỉ câu hỏi, nhưng cảm ơn. – duffymo

0

Có thể sử dụng proxy jdbc driver để đăng nhập tất cả các hành động cơ sở dữ liệu jdbc. trình điều khiển này có thể in tất cả các câu lệnh với các giá trị và tất cả các kết quả.

3

Có, bạn có thể thực hiện việc này. Bạn có thể quấn câu lệnh có thể gọi của bạn trong một proxy có thể thay thế các giá trị thực tế khi bạn in nó (và hiển thị sql), hoặc tìm kiếm xung quanh cho một trình điều khiển có một toString có ý nghĩa. javaworld article Ngoài ra còn có p6spy và các loại khác. Thủ tục lưu trữ khó hơn, nhưng vẫn có thể thực hiện được.

4

Bạn đang sử dụng log4j?

Nếu có, hãy thêm nhật ký cho sql như dưới đây.

log4j.logger.java.sql.Connection=DEBUG 
log4j.logger.java.sql.Statement=DEBUG 
log4j.logger.java.sql.PreparedStatement=DEBUG 
log4j.logger.java.sql.ResultSet=DEBUG 

Nếu bạn đang sử dụng khung ORM như ibatis, bạn có thể thêm trình ghi nhật ký bổ sung như dưới đây.

log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG 
+0

Hành vi thực tế phụ thuộc vào sự hỗ trợ của trình điều khiển cơ bản. – ggb667

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