如何使用函数调用从java端访问%ROWTYPE%

时间:2017-01-27 14:35:36

标签: java oracle

我在oracle db中有这样的功能。

  create or replace function pin_sf_get_pin_detail
    (p_pin in varchar2)
    return pin_tm_form%rowtype
    as

    l_pin_record pin_tm_form%rowtype;
    begin
    select * into l_pin_record from pin_tm_form
    where pin = p_pin;
    return(l_pin_record);
    end;

我想从java端调用这个函数,因为我编写了一个不起作用的小程序。这是我的java程序。

final String typeName = "pin_details";
         final  String typeTableName  = "pin_tm_form";
         Connection con=ConnectionTest.getConnection();
         final StructDescriptor structDescriptor = StructDescriptor.createDescriptor(typeName.toUpperCase(),con);        
         final ResultSetMetaData metaData = structDescriptor.getMetaData();

        CallableStatement cst=(OracleCallableStatement)con.prepareCall("{?=call pin_sf_get_pin_detail(?)}");
        cst.registerOutParameter(1,OracleTypes.CURSOR,typeTableName.toUpperCase());
        cst.setString(2,"505460");
        cst.execute();
            Object  [] data = (Object[]) ((java.sql.Array) cst.getObject(1)).getArray();
                 for(Object tmp : data) {  
                     Struct row = (Struct) tmp; 
                     int idx = 1;  
                     for(Object attribute : row.getAttributes()) {
                        if(metaData.getColumnName(idx).equalsIgnoreCase("FIRST_NAME")) 
                        {
                        System.out.println((String)attribute);
                        }

                     }
                 }

我在oracle中创建了一个类型为Pin_details的类型。 这里我的疑问是cst.registerOutParameter当我尝试使用Types.ARRAY时,我必须传递的第二个参数我尝试使用Types类所有常量 它给出了无效的名称模式:Pin.Pin_tm_FORM但该表存在于同一模式中。 当我使用Types.VARCHAR时,它给出了

 java.sql.SQLException: ORA-06550: line 1, column 13:
    PLS-00382: expression is of wrong type
    ORA-06550: line 1, column 7:
    PL/SQL: Statement ignored

我只是尝试其他争论,但我真的不知道我必须通过什么以及它将如何运作。可以请任何人帮助解决这个问题。

0 个答案:

没有答案