如何将 return 游标连同新变量添加到每一行?

how to return a cursor along with new variable added to each row?

我想调用来自 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;
/

现在如何 return 游标 (data_test ) 中的所有 数据以及 more_detail 每行??即我希望 java 中的 ResultSet 具有 select 语句中的所有值以及 more_detail.Also 的值,我的 helloworld 是否将参数设置为 SYS_REFCURSOR 或其他??当从 java 调用时,我所要做的就是创建一个可调用语句并将参数注册为 Cursor 以使用它?

嗯,今天看的时候,我怎么会问这个问题。这太错误了。 当时对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();