Java 如何在JDBC中映射Oracle对象
我有这样一个oracle对象:Java 如何在JDBC中映射Oracle对象,java,oracle,jdbc,Java,Oracle,Jdbc,我有这样一个oracle对象: CREATE OR REPLACE type employee_obj AS object ( id NUMBER(10) , ... ) 存储过程 function get_employee_obj () return employee_obj is l_employee employee_obj; begin ... return l_
CREATE OR REPLACE type employee_obj
AS
object (
id NUMBER(10) ,
...
)
存储过程
function get_employee_obj () return employee_obj is
l_employee employee_obj;
begin
...
return l_employee;
end;
我需要从java代码中调用它:
final String QUERY = "begin ? := GET_EMPLOYEE_OBJ(); end;";
Connection connection = getConnection();
CallableStatement stmt = connection.prepareCall(QUERY);
stmt.registerOutParameter(1, <WHAT TO PUT HERE>);
stmt.execute();
ResultSet rs = (ResultSet) stmt.getObject(1);
...
final String QUERY=“begin?”:=GET_EMPLOYEE_OBJ();end;”;
Connection=getConnection();
CallableStatement stmt=connection.prepareCall(查询);
stmt.registerOutParameter(1,);
stmt.execute();
ResultSet rs=(ResultSet)stmt.getObject(1);
...
我需要指定什么sql或oracle类型作为registerOutParameter的参数,以便从存储函数中读取对象?我试了几次,但都得到了PLS-00382:表达式类型错误。谢谢 Oracle对象的正确类型是
java.sql.Types.STRUCT
或Oracle.jdbc.OracleTypes.STRUCT
,具体取决于您需要的支持级别
但是消除错误的诀窍是指定模式类型名称。所有大写字母都应拼写为,,否则您将得到无效的名称模式
异常
以您的示例为例,类似的内容可能是合适的:
stmt.registerOutParameter(1, OracleTypes.STRUCT, "EMPLOYEE_OBJ");
或
执行查询后,您可以通过以下方式访问结果:
STRUCT result = (oracle.sql.STRUCT)stmt.getObject(1);
Object[] attr = result.getAttributes();
// attr[0] if the first field
// attr[1] the second
// and so on
也许这将有助于与“从dual中选择get_employee_obj()”:哇,非常感谢Svlvain。在过去的两天里,我试图从Spring boot应用程序调用Oracle存储过程时出现了“type cannot be null”异常和“非法参数错误”,我尝试了NamedStoredProceduredQuery,Query,注释,最后使用SimpleJDBCall并将STRUCT的typeName作为注册SqlOutParameter的第三个参数,这是关键!伙计,非常感谢你,伙计!我现在也能看到数据了!
STRUCT result = (oracle.sql.STRUCT)stmt.getObject(1);
Object[] attr = result.getAttributes();
// attr[0] if the first field
// attr[1] the second
// and so on