如何将 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();
我想调用来自 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();