2016-08-18 28 views
0

我想從java調用一個過程。如何將光標連同添加到每行的新變量一起返回?

Example: 
CREATE OR REPLACE PROCEDURE helloworld 
AS 
cursor data_test is 
    with required_data as(select * 
     from EMPLOYEES) select * from required_data rd join DEPARTMENTS d on d.department_id=rd.DEPARTMENT_ID ; 
emp_rec data_test%ROWTYPE; 
more_detail varchar2(50); 
BEGIN 
    open data_test; 
    LOOP 
     FETCH data_test INTO emp_rec; 
     exit when data_test%NOTFOUND; 
     more_detail =BLA.GET_MORE_DATA(data_test.empid);// Lets say the fuction return varchar2 I've total of 4 similar fields to be added in total 
    END LOOP; 
END; 
/

現在我該怎樣在光標(data_test)返回所有數據,每行more_detail一起?即我希望我在Java中的ResultSet具有來自select語句的所有值以及more_detail的值。另外,我的helloworld將參數設置爲SYS_REFCURSOR或其他?當從java調用我所要做的就是創建一個可調用語句並註冊參數作爲遊標來使用它?

+1

有手冊中的例子來說明如何通過JDBC返回結果集。此外,在存儲過程結束後,結果集將定位在最後一行之後,因此它實際上是用途。可能是你想要的是在遊標的「SELECT」列表中調用'GET_MORE_DATA()'。 – mustaccio

+0

@mustaccio你能指點我參考的例子嗎?並且我從光標搜索關於調用函數,但函數將empId作爲Input參數和部門的一些值以及我將如何將它添加到一行中? – Kid101

+0

@mustaccio我在想什麼,除了遊標作爲輸出參數外,我還可以發送一個帶有key的關聯數組作爲我的empid和value,就像我從GET_MORE_DATA得到的一樣。現在如何在JDBC中使用JDBC檢索這些值?我應該從這個還是什麼提出一個新問題? – Kid101

回答

0

那麼,今天我看到它的時候,我怎麼能問這個問題。這是錯誤的。 然後我對PLSQL沒有太多的瞭解,並沒有太多的閱讀問這個問題。無論如何,有很多方法可以解決這個問題,正如我在評論中提到的那樣,可以發回一個關聯數組,但是如果您不知道預期結果的數量,那麼這對於java來說是一種痛苦。或者可以創建一個與用戶定義對象的嵌套數組像這樣:

CREATE OR REPLACE TYPE keyvalue AS object (col Number(10), col2 VARCHAR2(30)); 
CREATE OR replace TYPE map IS TABLE OF keyvalue ; 

聽到我是怎麼做到的。您不能向光標添加列,但可以創建自己的自定義數據類型。

CREATE OR REPLACE TYPE dbObject AS OBJECT 
    (
     empId NUMBER (6),// here add as many fields you want to return or want your object to have 
     emailId VARCHAR2 (25), 
     hiredate DATE 
    ); 
CREATE OR REPLACE TYPE datalist IS TABLE OF DBOBJECT; 

PROCEDURE get_emp_data (list OUT datalist) 
    AS 
     CURSOR emp_cursor 
     IS 
     SELECT employee_id AS empId, 
       EMPLOYEES.EMAIL AS emailId, 
       EMPLOYEES.HIRE_DATE AS hiring 
      FROM EMPLOYEES; 
      c_datatype emp_cursor%rowtype; 

    BEGIN 
    OPEN emp_cursor(); 
     list := datalist(); 
     LOOP 
     fetch emp_cursor into c_datatype; 
     EXIT WHEN emp_cursor%NOTFOUND; 
     list.extend; 
     list(emp_cursor%ROWCOUNT):=DBOBJECT(c_datatype.empId,c_datatype.emailId,c_datatype.hiring);   
     END LOOP; 
    END get_emp_data; 

現在你想從Java調用這樣的:這裏是代碼:

String dataTypeName = "DBOBJECT"; 
     String dataTypeListName = "datalist"; 
     StructDescriptor structDescriptor = StructDescriptor.createDescriptor(dataTypeName.toUpperCase(), connection);  
     ResultSetMetaData metaData = structDescriptor.getMetaData(); 
     CallableStatement cs = connection.prepareCall("{call TEST_PACKAGE.get_emp_data(?)}"); 
     cs.registerOutParameter(1, OracleTypes.ARRAY, dataTypeListName.toUpperCase());  
     cs.execute(); 
     Object[] data = (Object[]) ((Array)cs.getObject(1)).getArray(); 
     for(Object tmp : data) { 
      Struct row = (Struct) tmp; 
      int index = 1; 
      for(Object attribute : row.getAttributes()) {    
       System.out.println(metaData.getColumnName(index) + " : " + attribute);           
       ++index ; 
      } 

     } 
     cs.close(); 
相關問題