那么,今天我看到它的时候,我怎么能问这个问题。这是错误的。 然后我对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();
有手册中的例子来说明如何通过JDBC返回结果集。此外,在存储过程结束后,结果集将定位在最后一行之后,因此它实际上是用途。可能是你想要的是在游标的“SELECT”列表中调用'GET_MORE_DATA()'。 – mustaccio
@mustaccio你能指点我参考的例子吗?并且我从光标搜索关于调用函数,但函数将empId作为Input参数和部门的一些值以及我将如何将它添加到一行中? – Kid101
@mustaccio我在想什么,除了游标作为输出参数外,我还可以发送一个带有key的关联数组作为我的empid和value,就像我从GET_MORE_DATA得到的一样。现在如何在JDBC中使用JDBC检索这些值?我应该从这个还是什么提出一个新问题? – Kid101