2011-01-17 2 views
0

хранимой процедура (спецификация только):вызова хранимой процедура в спящих ошибках

CREATE OR REPLACE PACKAGE "PACK_USER"  
as 
type contact is table of nvarchar2(50) INDEX BY BINARY_INTEGER; 
procedure create_user( 
user_id out number, 
pwd in nvarchar2, 
birthday in date, 
gender in number, 
address in nvarchar2, 
realName in nvarchar2, 
identity in nvarchar2, 
salary in float, 
contractTime in date, 
departmentId in number, 
positionId in number 
); 
end pack_user; 
/

Это нормально, когда я называю его от жабы. Но когда я вызываю его из спящего режима, он говорит «неверный оператор SQL», но никакой причины не отображается. спящего режима отображения:

<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> 

называют:

Session session = this.getSession(); 
Query q = session.getNamedQuery("create_user"); 
q.setString("pwd", userInfo.getIndentity()); 
q.setDate("birthday", userInfo.getBirthday()); 
q.setInteger("gender", userInfo.isGender() ? 1 : 0); 
q.setString("address", userInfo.getHomeAddress()); 
q.setString("realName", userInfo.getRealname()); 
q.setString("identity", userInfo.getIndentity()); 
q.setFloat("salary", userInfo.getBaseSalary()); 
q.setDate("contractTime", userInfo.getContractTime()); 
q.setInteger("departmentId", userInfo.getDepartmentId()); 
q.setInteger("positionId", userInfo.getPositionId()); 
int res = (Integer)q.uniqueResult(); 
return res; 

PS: Так как это проект, конечно, оракул и хранимая процедура требуется во время спящего режима нет.
Я уже пытался переместить процедуру из пакета или создать функцию вместо процедуры. Ничего не работает.
оракул версия 10г

ответ

1

Там могут быть некоторые проблемы в файле конфигурации, смотрите ниже пример для более разъяснений:

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; 

Hibernate XML

<?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> 

Убедитесь, что вы использовали правильную базу данных значение имени поля для атрибута column для отображения свойства return. Вы получите следующую ошибку, если не указали правильное имя поля базы данных

не удалось выполнить запрос; плохая грамматика SQL [{вызов SP_LIB_DTL (?,?)}]; Вложенное исключение - java.sql.SQLException: Недопустимое имя столбца

Вот реализация DAO для выполнения запроса и установки значений параметра связывания.

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(); 
       } 
      }); 
     } 
+1

Вот ссылка: http://docs.jboss.org/hibernate/stable/core/reference/en/html_single/#sp_query. Для Oracle применяются следующие правила: * Функция должна возвращать набор результатов. Первым параметром процедуры должен быть OUT, который возвращает набор результатов. Это делается с использованием типа SYS_REFCURSOR в Oracle 9 или 10. В Oracle вам необходимо определить тип REF CURSOR. См. Литературу Oracle для получения дополнительной информации. –

+0

My proc не возвращает таблицу, а целое число. Поэтому для конфигурации не требуется поле столбца. Это не может быть эта проблема. – gengchensh

+0

Хорошо, я попытаюсь вернуть курсор – gengchensh

Смежные вопросы