Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在JDBC中映射Oracle对象_Java_Oracle_Jdbc - Fatal编程技术网

Java 如何在JDBC中映射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_

我有这样一个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_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