各位好,今天参照Hibernate3.2官方参考手册关于Hibernate调用存储过程的章节,编写了一个简单的示例,但是再调用时出现了相关错误,请各位帮忙看看。b]错误如下[/b]:
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not execute query
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.loader.Loader.doList(Loader.java:2147)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2028)
at org.hibernate.loader.Loader.list(Loader.java:2023)
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:289)
at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1695)
at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142)
at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:150)
at hello.ItemBidsSetMain.main(ItemBidsSetMain.java:52)
Caused by: java.sql.SQLException: ORA-00900: 无效 SQL 语句

示例代码主要部分:Item.hbm.xml<sql-query name="selectAllItems" callable="true">
<return alias="items" class="hello.Item">
<return-property name="id" column="ITEM_ID" />
<return-property name="name" column="NAME" />
</return>

{?=call selectAllItems()}
</sql-query>SQL文件:create table ITEM_PD_H(
ITEM_ID number not null ,
NAME varchar2(277),
DESCRIPTION varchar2(277),
ITEM_DATE date,
primary key (ITEM_ID),
unique(NAME)
);CREATE OR REPLACE FUNCTION   selectAllItems RETURN SYS_REFCURSOR AS st_cursor SYS_REFCURSOR; BEGIN 
    
OPEN st_cursor FOR
     
  SELECT i.ITEM_ID,i.NAME FROM ITEM_PD_H i; 
    
    RETURN  st_cursor; 
 
END;
/执行程序类代码:
Session secondSession = HibernateUtil.getSessionFactory().openSession();
Transaction secondTransaction = secondSession.beginTransaction();List<Item> itemList = secondSession.getNamedQuery("selectAllItems").list();// 这一行报错

解决方案 »

  1.   

    二中方法
    1.放在临时表里面
    2.若在oracle中自己定义一个数组类型,存放
    3.数据不多,可以把数据拼接为字符串返回
      

  2.   

    CREATE OR REPLACE FUNCTION  selectAllItemsRETURN SYS_REFCURSORAS st_cursor SYS_REFCURSOR;BEGIN
       
    OPEN st_cursor FOR
       
    SELECT i.ITEM_ID,i.NAME FROM ITEM_PD_H i;
       
       go;END; 不知道这样可不可以,好久没写了。
      

  3.   

    你用的是动态游标
    Type cursorvar is ref cursor
    varname cursorvar --把游标赋予一个变量
    begin
      open varname for select..............
    end游标必须先声明你的存储过程也声明错了CREATE OR REPLACE FUNCTION selectAllItems(varname out cursor)
    ..........