使用返回对象类型的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,

我从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,
                         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错误消息或堆栈跟踪(相关部分),以便我们能够更多地了解您实际遇到的问题?