呼叫功能 PL/SQL, 返回类型 Oracle 的 Java

我有一个功能 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, 我得到了 SQLException 有消息 "无效的列类型: 1111".

如果我的方法有任何问题,任何人都可以告诉我,或者是否有其他方法可以获得返回的类型 oracle 作为对象 java.

EDIT:


create or replace 
TYPE PROCESSEXCELFILEARGS FORCE AS OBJECT
/
FullFilePath VARCHAR2/700/,
Filename VARCHAR2/200/,
Graph TYPEGRAPHDATA
/


请不要这么想 TYPEGRAPHDATA - 这是另一种自定义类型 Oracle 在架构水平

已邀请:

董宝中

赞同来自:

你可以使用这个类 oracle.sql.STRUCT. 最简单的例子:

在 Oracle G。:


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

小姐请别说爱

赞同来自:

好吧,我设法获得了返回的类型 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 并添加了K. Oracletype 班级匹配 java 使用地图类型的连接。

快网

赞同来自:

你有一种类型 Oracle - 这是

RECORD

:


TYPE my_type IS RECORD /
foo VARCHAR2 /12/
/;


在 oracle 您的功能返回

PIPELINE

:


FUNCTION my_funtion /
foo VARCHAR2,
bar VARCHAR2
/
RETURN my_type PIPELINED


在 java 可以使用
https://oracle-base.com/articl ... tions
, 然后从中提取值 ResultSet


select * from table /URGP.PKG_AG_SIR_MEW.RECUPERARPERSONAPORNRODOC/?,?//

江南孤鹜

赞同来自:

这里我没有看到特殊需要使用对象从包函数接收背表数据 CallableStatement. 相反,我们可以使用通常的请求 sql, 要将结果包装并将其提取到正常的结果集中 java. 这样做,我们避免尝试找到一个调节包功能的痛苦解决方案 /它使用包级类型/, 留下完整的包装的功能和类型,并继续使用未知的内部功能和传送速度。 plsql. Panos Zafiropoulos。

要回复问题请先登录注册