2016-08-18 90 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(); 
相关问题