使用返回对象类型的java调用存储过程
我从java调用存储过程。哪个返回参数是对象类型 对象类型:使用返回对象类型的java调用存储过程,java,sql,oracle,stored-procedures,Java,Sql,Oracle,Stored Procedures,我从java调用存储过程。哪个返回参数是对象类型 对象类型: create or replace TYPE xx_hr_leave_record as OBJECT ( employee_name varchar2 (250), employee_number varchar2(10), Organization varchar2(250) ); 程序: PROCEDURE GetLeaveInfo(p_notification_id IN NUMBER,
create or replace TYPE xx_hr_leave_record as OBJECT
(
employee_name varchar2 (250),
employee_number varchar2(10),
Organization varchar2(250)
);
程序:
PROCEDURE GetLeaveInfo(p_notification_id IN NUMBER,
p_leave_detail OUT NOCOPY xx_hr_leave_record,
p_result OUT NOCOPY NUMBER,
p_error_code OUT NOCOPY NUMBER,
p_error_msg OUT NOCOPY VARCHAR2);
我使用返回正确输出的pl/sql调用此过程
但我在以下链接的帮助下调用上述程序
我的Java代码:
package com.ind.middleware;
import java.sql.Array;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.sql.Struct;
import java.sql.Types;
import java.util.ArrayList;
import oracle.jdbc.driver.OracleTypes;
import oracle.sql.StructDescriptor;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import com.db.DBConnectionManager;
public class AbsenceDetail
{
int notificationId;
Connection conn =null;
ResultSet rset = null;
Statement stmt = null;
CallableStatement cstmt=null;
ArrayList<String> aryNotificationType = null;
DBConnectionManager db;
String qry="";
String NotificationType=null;
final String typeName = "xx_hr_leave_record";
JSONArray json = new JSONArray();
int result,error_code;
String error_msg= "";
@SuppressWarnings("unchecked")
public void getData() throws Exception
{
try
{
db = new DBConnectionManager();
conn=db.getConnection();
if(conn!=null)
{
final StructDescriptor structDescriptor = StructDescriptor.createDescriptor(typeName.toUpperCase(), conn);
final ResultSetMetaData metaData = structDescriptor.getMetaData();
cstmt = conn.prepareCall("{call APPS.EVO_HR_LEAVE_SERVICES.GetLeaveInfo(?, ?, ?, ?, ?)}");
cstmt.setInt(1,254163);
cstmt.registerOutParameter(2, OracleTypes.STRUCT,typeName.toUpperCase());
cstmt.registerOutParameter(3,Types.INTEGER);
cstmt.registerOutParameter(4,Types.INTEGER);
cstmt.registerOutParameter(5,Types.CHAR);
cstmt.execute();
if(cstmt.getInt(3) == 0)
{
Object[] data = (Object[]) ((Array) cstmt.getObject(2)).getArray();
System.out.print("data length : " + data.length);
for(Object tmpAbsence : data)
{
JSONObject jObj = new JSONObject();
Struct rowAbsence = (Struct) tmpAbsence;
int j = 1;
for(Object attribute : rowAbsence.getAttributes())
{
System.out.println(metaData.getColumnName(j) + " = " + attribute);
if(metaData.getColumnName(j).equals("employee_name"))
{
jObj.put(metaData.getColumnName(j), attribute);
}
if(metaData.getColumnName(j).equals("employee_number"))
{
jObj.put(metaData.getColumnName(j), attribute);
}
else if(metaData.getColumnName(j).equals("Organization"))
{
jObj.put(metaData.getColumnName(j), attribute);
}
j++;
}
}
}
}
}
catch(Exception e)
{
System.out.println("ERROR in : ");
e.printStackTrace();
}
}
public static void main(String []arg)
{
AbsenceDetail wa = new AbsenceDetail();
try {
System.out.println("Absence Detail class");
wa.getData();
} catch (Exception e) {
e.printStackTrace();
}
}
}
包com.ind.middleware;
导入java.sql.Array;
导入java.sql.CallableStatement;
导入java.sql.Connection;
导入java.sql.ResultSet;
导入java.sql.ResultSetMetaData;
导入java.sql.Statement;
导入java.sql.Struct;
导入java.sql.Types;
导入java.util.ArrayList;
导入oracle.jdbc.driver.OracleTypes;
导入oracle.sql.StructDescriptor;
导入org.json.simple.JSONArray;
导入org.json.simple.JSONObject;
导入com.db.DBConnectionManager;
公开课缺席详情
{
int通知ID;
连接conn=null;
ResultSet-rset=null;
语句stmt=null;
CallableStatement cstmt=null;
ArrayList aryNotificationType=null;
数据库连接管理器数据库;
字符串qry=“”;
字符串NotificationType=null;
最终字符串typeName=“xx\U hr\U休假记录”;
JSONArray json=新的JSONArray();
int结果,错误代码;
字符串错误_msg=“”;
@抑制警告(“未选中”)
public void getData()引发异常
{
尝试
{
db=新的DBConnectionManager();
conn=db.getConnection();
如果(conn!=null)
{
final StructDescriptor StructDescriptor=StructDescriptor.createDescriptor(typeName.toUpperCase(),conn);
最终结果SetMetadata元数据=structDescriptor.getMetaData();
cstmt=conn.prepareCall({call APPS.EVO_HR_LEAVE_SERVICES.GetLeaveInfo(?,,,?,,?)});
cstmt.setInt(1254163);
registerOutParameter(2,OracleTypes.STRUCT,typeName.toUpperCase());
cstmt.registerOutParameter(3,类型.INTEGER);
cstmt.registerOutParameter(4,Types.INTEGER);
cstmt.registerOutParameter(5,Types.CHAR);
cstmt.execute();
if(cstmt.getInt(3)==0)
{
Object[]data=(Object[])((Array)cstmt.getObject(2)).getArray();
系统输出打印(“数据长度:”+数据长度);
for(对象tmpabsense:data)
{
JSONObject jObj=新的JSONObject();
结构行缺失=(结构)tmpAbsence;
int j=1;
for(对象属性:rowExistence.getAttributes())
{
System.out.println(metaData.getColumnName(j)+“=”+属性);
if(metaData.getColumnName(j).equals(“员工名称”))
{
put(metaData.getColumnName(j),属性);
}
if(metaData.getColumnName(j).equals(“员工编号”))
{
put(metaData.getColumnName(j),属性);
}
else if(metaData.getColumnName(j).equals(“组织”))
{
put(metaData.getColumnName(j),属性);
}
j++;
}
}
}
}
}
捕获(例外e)
{
System.out.println(“错误输入:”);
e、 printStackTrace();
}
}
公共静态void main(字符串[]arg)
{
缺勤详情wa=新的缺勤详情();
试一试{
System.out.println(“缺勤明细类”);
wa.getData();
}捕获(例外e){
e、 printStackTrace();
}
}
}
很难看出你想问什么。您确实说过该过程正在返回正确的输出,但您发布此消息的原因是什么?我已经提到,该过程在pl/sql而不是java中运行良好。我不能用java调用这个过程。你当然是对的,只是有点隐藏在所有代码中。但是,您应该发布Java错误消息或堆栈跟踪(相关部分),以便我们能够更多地了解您实际遇到的问题?