2015-08-06 17 views
7

Câu hỏi của tôi có thể hơi khó hiểu một chút. Tôi có vấn đề mà tôi đang kêu gọi một thủ tục với StoredProcedureCall từ Java ví dụ:StoredProcedureCall 1x Đầu ra Varchar 1x Đầu ra con trỏ

StoredProcedureCall call = new StoredProcedureCall(); 
    call.setProcedureName("test"); 
    call.addNamedArgument("p_year"); 
    call.addNamedArgument("p_rel"); 
    call.useNamedCursorOutputAsResultSet("p_resset"); 

resset là kết quả của tôi như là một con trỏ - như bạn có thể nhìn thấy - điều này hoạt động mà không bất kỳ vấn đề trong khi thủ tục trông giống như:

create or replace PROCEDURE TEST (p_year IN NUMBER, 
       p_rel IN VARCHAR2, 
       p_resset OUT SYS_REFCURSOR) AS 
    BEGIN 
     OPEN p_resset FOR 
      SELECT NVL (s.KA, 'Summe') ka, 
        COUNT (s.AZ) az 
      FROM table1 s, 
        table2 w 
      WHERE s.year= w.year 
       AND w.relevant = p_rel 
       AND s.year = p_year 
END; 

Bây giờ tôi đã thêm một tham số đầu ra được đặt tên "p_data" với một lựa chọn cuộc gọi riêng

create or replace PROCEDURE TEST (p_year IN NUMBER, 
       p_rel IN VARCHAR2, 
       p_data OUT VARCHAR2, 
       p_resset OUT SYS_REFCURSOR) AS 
    BEGIN 
     SELECT month 
     INTO p_data 
     FROM month_table b 
     WHERE month_nr = (SELECT MAX (month) 
          FROM instruction 
          WHERE year= b.year) 
      AND year= p_year; 

OPEN p_resset FOR 
      SELECT NVL (s.KA, 'Summe') ka, 
        COUNT (s.AZ) az 
      FROM table1 s, 
        table2 w 
      WHERE s.year= w.year 
       AND w.relevant = p_rel 
       AND s.year = p_year 
END; 

Và đó là nơi tôi có bị mắc kẹt.

Tôi không biết làm thế nào để gọi một chuỗi duy nhất mà là kết quả của báo cáo kết quả lựa chọn mới (tháng) Tôi cố gắng thêm

"call.addNamedOutputArgument("p_data");" 

nhưng đó là hoàn toàn sai.

có lẽ cũng tốt để biết là cách tôi xử lý các kết quả tôi nhận được trở lại từ cuộc gọi đầu tiên:

DataReadQuery query = new DataReadQuery(); 
       query.setCall(call); 
       query.addArgument("p_year"); 
       query.addArgument("p_rel"); 


       @SuppressWarnings("rawtypes") 
       List args = new ArrayList(); 
       args.add(dbyear); 
       args.add(relevation); 

       @SuppressWarnings("rawtypes") 
       List result= (List) s.executeQuery(query, args); 

    for (int i = 0; i < ergebnis.size(); i++){ 
    testDto record = new testDto(); 
    ArrayRecord ar=(ArrayRecord) ergebnis.get(i); 

    record.setKa((ar.get("ka")).toString()); 
    record.setAz((ar.get("az")).toString()); 

    System.out.println("cursor : " + ergebnis.get(i)); 

    result.add(ergebnis); 
} 

nhưng như tôi đã nói tôi không thể xử lý chuỗi duy nhất để có được nó như một tham số để tạo tệp html/excel sau đó và đó là vấn đề tôi phải xử lý.

+0

Không biết Java vì vậy không đăng câu trả lời, một vài suy nghĩ mặc dù: bạn 'Chọn Into' truy vấn đã đưa trường 'tháng' vào một p_data bảng mới có tên gọi ; 'Chọn vào' sẽ không tạo ra kết quả/trả về và dữ liệu, chỉ thực hiện hành động này. Để lấy dữ liệu từ P_data, bạn sẽ cần một câu lệnh chọn riêng (chọn tháng từ p_data.) Bạn cũng đã nói rằng P_Data là một kiểu dữ liệu varchar2, khi nó thực sự là một bảng .. vì vậy tôi không nghĩ điều đó đúng. – JeffUK

+0

[this] (http://dreamand.me/java/java-jee7-jpa-stored-procedure-example/) có thể trợ giúp –

Trả lời

0

Tôi nghĩ bạn thân thiết. bạn cần để có được giá trị từ resultset

thử một cái gì đó giống như

StoredProcedureCall call = new StoredProcedureCall(); 
    call.setProcedureName("test"); 
    call.addNamedArgument("p_year"); 
    call.addNamedArgument("p_rel"); 
    call.addNamedOutputArgument("p_data"); 
    call.useNamedCursorOutputAsResultSet("p_resset"); 


    @SuppressWarnings("rawtypes") 
    List result= (List) s.executeQuery(query, args); 
    DatabaseRecord record = (DatabaseRecord)results.get(0); 
    String data = (String) record.get("p_data"); 

kiểm tra ra những đoạn

http://www.ctmmc.net/how-to-call-stored-procedures

http://blog.yenlo.com/nl/calling-oracle-stored-procedures-from-eclipselink-with-multiple-out-parameters

0

của bạn 'Chọn Into' truy vấn đã chèn ' trường 'tháng vào một bảng mới p_data. 'Chọn vào' sẽ không trả lại dữ liệu. Bạn cần phải viết truy vấn chọn riêng để tìm nạp dữ liệu từ bảng p_data: Khi bạn đã hoàn thành việc viết như thế này trong quy trình được lưu trữ. Hãy thử gọi thủ tục theo cách người nói trên.

StoredProcedureCall call = new StoredProcedureCall(); 
call.setProcedureName("test"); 
call.addNamedArgument("p_year"); 
call.addNamedArgument("p_rel"); 
call.addNamedOutputArgument("p_data"); 
call.useNamedCursorOutputAsResultSet("p_resset"); 


    @SuppressWarnings("rawtypes") 
    List result= (List) s.executeQuery(query, args); 
    DatabaseRecord record = (DatabaseRecord)results.get(0); 
    String data = (String) record.get("p_data"); 

Hy vọng điều này sẽ làm việc cho bạn