Java 在hibernate错误中调用存储过程
存储过程(仅限规范): 当我从蟾蜍那里叫它时,它是好的。但当我从hibernate调用它时,它说“无效的SQL语句”,但没有显示原因。 休眠映射:Java 在hibernate错误中调用存储过程,java,hibernate,stored-procedures,oracle10g,Java,Hibernate,Stored Procedures,Oracle10g,存储过程(仅限规范): 当我从蟾蜍那里叫它时,它是好的。但当我从hibernate调用它时,它说“无效的SQL语句”,但没有显示原因。 休眠映射: <sql-query name="create_user" callable="true"> <return-scalar column="user_id" type="integer"/> { call PACK_USER.CREATE_USER(?,:pwd,:birthday,:gender,:addre
<sql-query name="create_user" callable="true">
<return-scalar column="user_id" type="integer"/>
{ call PACK_USER.CREATE_USER(?,:pwd,:birthday,:gender,:address,:realName,:identity,:salary,:contractTime,:departmentId,:positionId)}
</sql-query>
PS:由于这是一个课程项目,oracle和存储过程是必需的,而hibernate不是我已经尝试将过程移出包,或者创建一个函数而不是过程。两者都不起作用。
oracle版本10g您的配置文件中可能存在一些问题,请查看下面的示例以了解更多说明:
CREATE OR REPLACE PROCEDURE SP_LIB_DTL(p_cursor out sys_refcursor,
in_brnch_cd in number,
in_auth_cd in number)
as
bookName varchar2(8);
ISBN number;
begin
bookName := null;
ISBN := 0;
open p_cursor for
select l.book_name, l.isbn_nbr
into bookName, ISBN
from LIB_BRNCH_DTL l
where l.branch_code = in_brnch_cd
and l.auth_code = in_auth_cd;
end;
HibernateXML
<?xml version=”1.0″ encoding=”utf-8″?>
<!DOCTYPE hibernate-mapping PUBLIC “-//Hibernate/Hibernate Mapping DTD 3.0//EN”
“http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd“>
<hibernate-mapping>
<class name=”com.org.lib.LibraryDetails”>
<id name=”ISBN” type=”long” />
<property name=”bookName” type=”string” />
</class>
<sql-query name=”LIB_SP” callable=”true”>
<return class=”com.org.lib.LibraryDetails”>
<return-property name=”ISBN” column=”isbn_nbr” />
<return-property name=”bookName” column=”book_name” />
</return>
{ call SP_LIB_DTL(? , :branchCD ,:authorCD) }
</sql-query>
</hibernate-mapping>
这里有一个链接:。对于Oracle,以下规则适用:*函数必须返回结果集。过程的第一个参数必须是返回结果集的OUT。这是通过在Oracle 9或10中使用SYS_REFCURSOR类型来完成的。在Oracle中,需要定义REF游标类型。有关更多信息,请参阅Oracle文献。My proc不返回表,而是返回整数。因此,配置时不需要列字段。不可能是这个问题。好吧,我会试着返回一个游标。。。还是一样的问题。它从来没有给我一个详细的错误信息,所以我不知道发生了什么。。。
CREATE OR REPLACE PROCEDURE SP_LIB_DTL(p_cursor out sys_refcursor,
in_brnch_cd in number,
in_auth_cd in number)
as
bookName varchar2(8);
ISBN number;
begin
bookName := null;
ISBN := 0;
open p_cursor for
select l.book_name, l.isbn_nbr
into bookName, ISBN
from LIB_BRNCH_DTL l
where l.branch_code = in_brnch_cd
and l.auth_code = in_auth_cd;
end;
<?xml version=”1.0″ encoding=”utf-8″?>
<!DOCTYPE hibernate-mapping PUBLIC “-//Hibernate/Hibernate Mapping DTD 3.0//EN”
“http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd“>
<hibernate-mapping>
<class name=”com.org.lib.LibraryDetails”>
<id name=”ISBN” type=”long” />
<property name=”bookName” type=”string” />
</class>
<sql-query name=”LIB_SP” callable=”true”>
<return class=”com.org.lib.LibraryDetails”>
<return-property name=”ISBN” column=”isbn_nbr” />
<return-property name=”bookName” column=”book_name” />
</return>
{ call SP_LIB_DTL(? , :branchCD ,:authorCD) }
</sql-query>
</hibernate-mapping>
public List selectBooks(final BigDecimal branchCode,final BigDecimal authorCode){
return (List) getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException, SQLException
{
Query q = session.getNamedQuery(“LIB_SP”);
q.setLong(“branchCD”, branchCode.longValue());
q.setLong(“authorCD”, authorCode.longValue());
return q.list();
}
});
}