在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课程中,我有所有连接等等。我可以访问其他过程和函数但不是这个接受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对象不起作用。 任何帮助表示感谢,提前谢谢
答案 0 :(得分:0)
在匿名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
类,以便可以将其传入/传出数据库。
答案 1 :(得分:0)
对于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定义的Type,则可以说:
.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()
在您的查询方法中。