我有一个PL/SQL函数,如下所示,它返回Oracle类型(PROCESSEXCLEFILEARGS)
FUNCTION PROCESS_FILE_INTERNAL
(
i_Filename VARCHAR2,
i_EventType NUMBER
)
RETURN PROCESSEXCELFILEARGS我必须从Java调用这个函数,我的Java方法如下所示
OracleCallableStatement cstmt = null;
try{
OracleDriver ora = new OracleDriver();
DriverManager.registerDriver(ora);
Connection connection = ora.defaultConnection();
String call = "{ ? = call NEUTRINO_META.PKG_EXCEL.PROCESS_FILE_INTERNAL(?, ?) }";
cstmt = (OracleCallableStatement)connection.prepareCall(call);
cstmt.setQueryTimeout(1800);
cstmt.registerOutParameter(1, OracleTypes.OTHER, "NEUTRINO_META.PROCESSEXCELFILEARGS");
cstmt.setString(2, filename);
cstmt.setDouble(3, eventType);
cstmt.execute();
OracleObjects.ProcessExcelFileArgsobj = (OracleObjects.ProcessExcelFileArgs)cstmt.getObject(1);
connection.commit();
}
catch (SQLException e){
WriteEventToDb(e.getMessage());
}
finally{
if (cstmt != null){
cstmt.close();
}
}OracleObject.ProcessExcelFileArgs正在实现SQLData,而readSQl(..)和writeSQL(..)方法正确地实现了读取和写入类型字段。
但是,当我运行这个java方法时,我得到了一个消息‘无效列类型: 1111’的SQLException
有谁能让我知道我所采用的方法是否有什么问题,或者是否有其他方法将返回oracle类型作为java对象进行检索。
编辑:
create or replace
TYPE PROCESSEXCELFILEARGS FORCE AS OBJECT
(
FullFilePath VARCHAR2(700),
Filename VARCHAR2(200),
Graph TYPEGRAPHDATA
)请不要说TYPEGRAPHDATA是另一个在模式级别上定义的Oracle类型。
谢谢
发布于 2014-03-06 10:28:46
好的,通过使用下面的代码,我设法将返回的oracle类型作为java对象。
try{
Map rtn = connection.getTypeMap();
rtn.put("NEUTRINO_META.PROCESSEXCELFILEARGS", Class.forName("OracleObjects.ProcessExcelFileArgs"));
String call = "{ ? = call NEUTRINO_META.PKG_EXCEL.PROCESS_FILE_INTERNAL(?, ?) }";
cstmt = (OracleCallableStatement)connection.prepareCall(call);
cstmt.setQueryTimeout(1800);
cstmt.registerOutParameter(1, OracleTypes.STRUCT, "NEUTRINO_META.PROCESSEXCELFILEARGS");
cstmt.setString(2, filename);
cstmt.setDouble(3, eventType);
cstmt.execute();
ProcessExcelFileArgs args = (ProcessExcelFileArgs)cstmt.getObject(1, rtn);
}
catch (SQLException e){
WriteEventToDb(e.getMessage());
}
finally{
if (cstmt != null){
cstmt.close();
}
}我的ProcessExcelFileArgs类实现了java.sql.SQLData,并将Oracletype添加到java类映射到连接类型映射。
发布于 2014-03-05 16:46:48
您可以使用oracle.sql.STRUCT类。最简单的例子:
在Oracle中:
create type type_dummy is object (
id int,
name varchar2(10)
)
/
create or replace function get_type_dummy
return type_dummy
is
begin
return type_dummy(1,'ABCDe');
end;
/在Java中:
class TypeDummy {
public Long id;
public String name;
}
try {
DriverManager.registerDriver ( new oracle.jdbc.driver.OracleDriver());
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@ods.fors.ru:1521:test","odh","odh");
OracleCallableStatement cstmt = (OracleCallableStatement)conn.prepareCall("{ ? = call get_type_dummy }"); ;
cstmt.registerOutParameter(1, OracleTypes.JAVA_STRUCT, "TYPE_DUMMY");
cstmt.execute();
oracle.sql.STRUCT td = (oracle.sql.STRUCT)cstmt.getObject(1);
Object[] x = td.getAttributes();
TypeDummy ntd = new TypeDummy();
ntd.id = ((BigDecimal)x[0]).longValue();
ntd.name = (String)x[1];
System.out.println(ntd.id);
System.out.println(ntd.name);
cstmt.close();
}
...输出:
1
ABCDe发布于 2018-06-04 12:56:38
您有一个Oracle是RECORD
TYPE my_type IS RECORD (
foo VARCHAR2 (12)
);在oracle中,函数返回一个管道。
FUNCTION my_funtion (
foo VARCHAR2,
bar VARCHAR2
)
RETURN my_type PIPELINED在java中,您可以使用表功能,然后从ResultSet检索值。
select * from table (URGP.PKG_AG_SIR_MEW.RECUPERARPERSONAPORNRODOC(?,?))https://stackoverflow.com/questions/22201330
复制相似问题