繁体   English   中英

在Java中使用对象参数调用PL SQL函数

[英]Calling a PL SQL Function with object parameter in java

在Oracle SQL中,我有一个类型:

CREATE OR REPLACE type address_type
AS
OBJECT
(
Street VARCHAR2(100),
Road   VARCHAR2(100),
Town   VARCHAR2(100),
County VARCHAR2(100) );

这用于一个函数,该函数使用ADDRESS_TYPE将答案作为参数并返回整数:

create or replace FUNCTION ADD_ADDRESS_FUNC(
    New_Address IN Address_Type )
  RETURN INTEGER
AS
  AddressID INTEGER;
BEGIN
  AddressID := ADDRESS_SEQ.NEXTVAL;
  INSERT
  INTO Address VALUES
    (
      AddressID,
      New_Address.Street,
      New_Address.Road,
      New_Address.Town,
      New_Address.County
    );
  DBMS_OUTPUT.PUT_LINE(AddressID);
  RETURN AddressID;
END;

在我的Java类中,我具有所有的连接等,并且我可以访问其他procs和函数,但不能访问采用Address对象的那个。 在Java中,我创建了一个包含4个字符串的Address对象,肯定可以将其作为下面的第二个参数传递:

Address a = new Address("Address 1", "Address 2", "Town", "County");
CallableStatement stmt = conn.prepareCall( "begin ? := ADD_ADDRESS_FUNC(?);end;" );
stmt.registerOutParameter(1, Types.CHAR);
stmt.setObject(2, a);
stmt.execute ();
int memberID = stmt.getInt(1);`

错误消息显示无效的列索引,并且在setObject调用中已损坏。 如果它是字符串,则可以,但是Address对象不起作用。 任何帮助表示赞赏,在此先感谢

在匿名PL / SQL块(而不是Java)中创建类型,然后传递值:

CallableStatement st = con.prepareCall("BEGIN ? := ADD_ADDRESS_FUNC( Address_Type(?,?,?,?)); END;");

st.registerOutParameter( 1, Types.INTEGER );
st.setString( 2, "Address 1" );
st.setString( 3, "Address 2" );
st.setString( 4, "Town" );
st.setString( 5, "County" );

st.execute();
int id = st.getInt(1);

另一种选择是,您可以使用JPublisher生成Address类,以便可以将其传递到数据库或从数据库传递。

对于Oracle Functions,可以将本机sql查询与Hibernate一起使用,如下所示:

Query query = session.createSqlQuery("select PACKAGE.AddAdress(:STREET, :ROAD, :TOWN, :COUNTRY) as ADDRESS_ID from DUAL")
             .addScalar("ADDRESS_ID", java.sql.integer);

  query.setParameter(":STREET", "Street name")
  query.setParameter(":ROAD", "Road name")
  etc... ;

int addrId = (int) query.UniqueResult();

addScalar方法对于检索ResultSet是必需的。 如果函数返回Oracle定义的类型,则可以说:

.addScalar("ADDRESS_ID", new CustomType(new OracleType()))

并且此OracleType将是与Oracle Type匹配的类型。 因此,创建一个实现UserType的类OracleType并重写该方法

nullSafeGet(ResultSet rs, Sting name..){
   Object[] result = (java.sql.STRUCT) rs.getObject(names[0]).getAttributes()
}

然后,此result将是query.uniqueResult返回的对象,如下所示:查询方法中的Object[] result = query.uniqueResult()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM