首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用PL/SQL函数从Java返回Oracle类型

调用PL/SQL函数从Java返回Oracle类型
EN

Stack Overflow用户
提问于 2014-03-05 14:57:55
回答 4查看 11.9K关注 0票数 3

我有一个PL/SQL函数,如下所示,它返回Oracle类型(PROCESSEXCLEFILEARGS)

代码语言:javascript
复制
FUNCTION PROCESS_FILE_INTERNAL
    (
      i_Filename VARCHAR2,
      i_EventType NUMBER
    ) 
    RETURN PROCESSEXCELFILEARGS

我必须从Java调用这个函数,我的Java方法如下所示

代码语言:javascript
复制
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对象进行检索。

编辑:

代码语言:javascript
复制
create or replace 
TYPE PROCESSEXCELFILEARGS FORCE AS OBJECT 
( 
  FullFilePath VARCHAR2(700),
  Filename VARCHAR2(200),
  Graph TYPEGRAPHDATA
)

请不要说TYPEGRAPHDATA是另一个在模式级别上定义的Oracle类型。

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-03-06 10:28:46

好的,通过使用下面的代码,我设法将返回的oracle类型作为java对象。

代码语言:javascript
复制
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类映射到连接类型映射。

票数 2
EN

Stack Overflow用户

发布于 2014-03-05 16:46:48

您可以使用oracle.sql.STRUCT类。最简单的例子:

在Oracle中:

代码语言:javascript
复制
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中:

代码语言:javascript
复制
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();        
    }
...

输出:

代码语言:javascript
复制
1
ABCDe
票数 4
EN

Stack Overflow用户

发布于 2018-06-04 12:56:38

您有一个Oracle是RECORD

代码语言:javascript
复制
TYPE my_type IS RECORD (
    foo      VARCHAR2 (12)
);

在oracle中,函数返回一个管道

代码语言:javascript
复制
FUNCTION my_funtion (
    foo   VARCHAR2,
    bar   VARCHAR2
)
RETURN my_type PIPELINED

在java中,您可以使用表功能,然后从ResultSet检索值。

代码语言:javascript
复制
select * from table (URGP.PKG_AG_SIR_MEW.RECUPERARPERSONAPORNRODOC(?,?))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22201330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档