关于SSH框架调用ORACLE存储过程的问题 急在线等

lvze521lvze 2011-07-06 08:49:29
CREATE OR REPLACE PROCEDURE ZZJHQR (
RESULTSET OUT TEST_ZZJHQR.testresultset
)
AS
begin
open RESULTSET for
select * from rwfpb;
end;
这个是ORACLE存储过程

CREATE OR REPLACE PACKAGE TEST_ZZJHQR is
type testresultset is ref cursor;
end TEST_ZZJHQR;
这个是返回数据集的程序包

public List getList() {
Session session =getSessionFactory().openSession();
SQLQuery query = session.createSQLQuery("{Call LIMING_ZZJHQR()}");
return query.list();
}
这个是底层DAO调用存储过程的方法,返回一个LIST

public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");

ApplicationContext context = getWebApplicationContext();
Irwglservice service = (Irwglservice)context.getBean("rwglservice");
zzjhqrForm zzForm = (zzjhqrForm) form;// TODO Auto-generated method stub
List resultList = null;
resultList = service.getList();
request.setAttribute("rwresultList", resultList);
ActionForward forward = mapping.getInputForward();
forward = mapping.findForward("success");
return forward;
}
这个是ACTION调用DAO层方法得到一个LIST
问题是执行完底层public List getList() {
Session session =getSessionFactory().openSession();
SQLQuery query = session.createSQLQuery("{Call LIMING_ZZJHQR()}");
return query.list();
}方法时,报错!
java.sql.SQLException: ORA-06550: 第 1 行, 第 7 列:
PLS-00306: 调用 'LIMING_ZZJHQR' 时参数个数或类型错误
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
我感觉是我那个数据集参数没添加进去,问题是怎么添加啊,那算一个游标吧,游标参数怎么添加啊,用我的那种调用方式
...全文
572 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaomaha 2011-08-08
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 lvze521lvze 的回复:]
引用 13 楼 xiaomaha 的回复:
Java code

@SuppressWarnings("unchecked")
public List findCreateSqlMap(final String sql,final Map parameter) {
List<Map> list = getHibernateTemplate().executeFind(new Hibern……
[/Quote]

不知道你解决了没有parameter明显就是参数的意思啦,
select * from User u where u.name=?
Map的key就是查询字段,name
Map的value就是对应的值?占位符的值
lvze521lvze 2011-07-09
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 xiaomaha 的回复:]
Java code

@SuppressWarnings("unchecked")
public List findCreateSqlMap(final String sql,final Map parameter) {
List<Map> list = getHibernateTemplate().executeFind(new HibernateCall……
[/Quote]
我感觉这个挺好的 就是不知道为什么执行就不成功呢
xdrs1314 2011-07-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 acertang 的回复:]

Connection conn = .....
ResultSet rs = null;
CallableStatement proc = null;
proc = (CallableStatement)conn
.prepareCall("{cal……
[/Quote]+1 楼主你存储过程有返回值的.
lvze521lvze 2011-07-08
  • 打赏
  • 举报
回复
Object[]这个事什么东西
lvze521lvze 2011-07-08
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 xiaomaha 的回复:]
Java code

@SuppressWarnings("unchecked")
public List findCreateSqlMap(final String sql,final Map parameter) {
List<Map> list = getHibernateTemplate().executeFind(new HibernateCall……
[/Quote]
问下啊 这2个第二个参数都分别怎么传递进去啊 没搞明白 第一个参数就是个SQL语句串 第二个参数是个数组吧 怎么定义穿进去啊
Laughing 2011-07-08
  • 打赏
  • 举报
回复
我记得hibernate有回调方法的呀,支持存储过程,上学的时候整过
使用8楼的方法
有两年了还没搞过hibernate呢,悲哀呵
黑夜里的黑猫 2011-07-07
  • 打赏
  • 举报
回复
hibernate不支持存储过程,你用JDBC吧
xiaomaha 2011-07-07
  • 打赏
  • 举报
回复

@SuppressWarnings("unchecked")
public List findCreateSqlMap(final String sql,final Map parameter) {
List<Map> list = getHibernateTemplate().executeFind(new HibernateCallback(){
public Object doInHibernate(Session session) throws HibernateException, SQLException {
SQLQuery query = session.createSQLQuery(sql);
query.setProperties(parameter).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
return (List<Map>)query.list();
}});
return list;
}

@SuppressWarnings("unchecked")
public List<Map> findCreateSqlMap(final String sql,final Object[] parameter) {
List<Map> list = getHibernateTemplate().executeFind(new HibernateCallback(){
public Object doInHibernate(Session session) throws HibernateException, SQLException {
SQLQuery query = session.createSQLQuery(sql);
for(int i=0;i<parameter.length;i++){
query.setParameter(i, parameter[i]);
}
query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
return (List<Map>)query.list();
}});
return list;
}

这个是我们直接在dao层封装的,所有service层都调用这一个dao,这两个你都可以使用,第二个既可以调用过程也可以执行普通sql 我们一直这样用的!所以不存在运行不了的问题!
xiaomaha 2011-07-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 xiaomaha 的回复:]
Java code

getHibernateTemplate().execute(new HibernateCallback(){

public Object doInHibernate(Session session) throws HibernateException, SQLException {
// TODO Auto……
[/Quote]
...首先我不是在网上随便给你找的,是我自己项目中复制过来的,明确的告诉你是能运行通过的!一个参数就一个setParameter,如果你需要返回值那么就不能用execute 而要用executeFind,返回值请调用query.list() ,这样就返回一个list对象里面就有相应的返回值,但我不建议你直接用query.list而更建议你使用query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); 这样声明后在query.list就返回一个list<map> map的key就是你数据库对应的列名称!更加方便你读取对应的数据,可读性也高了不少,我看了你的代码,你应该是使用了spring+hibernate ,spring对hibernate做完美封装,特别不建议你optionSession这样你写的事物配置就失去意义了,请使用回调函数!使用aop拦截来实现事物管理是最理想的!
acertang 2011-07-07
  • 打赏
  • 举报
回复
Connection conn = .....
ResultSet rs = null;
CallableStatement proc = null;
proc = (CallableStatement)conn
.prepareCall("{call 包名.存贮过程名(?)}");
proc.registerOutParameter(1, OracleTypes.CURSOR);
boolean result = proc.execute();
if (result) {
rs = (ResultSet)proc.getObject(1);
}
rs = (ResultSet)proc.getObject(1);

这样试试
流星谜 2011-07-07
  • 打赏
  • 举报
回复
SQLQuery query = session.createSQLQuery("{Call LIMING_ZZJHQR(?)}");
query.xxxxx(1,Type.XXXX);//设置注册类型
result = query.getXXX(1);//获取结果集

jdbc就是按上面那样来的, hibernate应该也一样,具体什么方法自己找下


lvze521lvze 2011-07-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 xiaomaha 的回复:]
Java code

getHibernateTemplate().execute(new HibernateCallback(){

public Object doInHibernate(Session session) throws HibernateException, SQLException {
// TODO Auto……
[/Quote]你能不能帮我看下一楼我发的 我要求返回一个LIST 还有存储过程里面就一个参数 应该算个游标 你别写的那么模糊啊 这些网上都有 不是执行不过去嘛
im110 2011-07-06
  • 打赏
  • 举报
回复
看似是缺少getKind()方法

[Quote=引用 4 楼 lvze521lvze 的回复:]
引用 2 楼 im110 的回复:
SQLQuery query = session.createSQLQuery("{Call LIMING_ZZJHQR()}");
把这一句换成下面的试试:
Query query = session.getNamedQuery("Call LIMING_ZZJHQR");

你这种方式不还要需要在表的映射文件中加
<sql-query nam……
[/Quote]
licip 2011-07-06
  • 打赏
  • 举报
回复
你的参数是输出,那还要注册一下,说明是要输出什么类型的参数。
lvze521lvze 2011-07-06
  • 打赏
  • 举报
回复
用我上面说的那种方式报错

2011-7-6 11:44:36 org.apache.catalina.core.ApplicationDispatcher invoke
严重: Servlet.service() for servlet jsp threw exception
javax.servlet.jsp.JspException: No getter method for property kind of bean list
lvze521lvze 2011-07-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 im110 的回复:]
SQLQuery query = session.createSQLQuery("{Call LIMING_ZZJHQR()}");
把这一句换成下面的试试:
Query query = session.getNamedQuery("Call LIMING_ZZJHQR");
[/Quote]
你这种方式不还要需要在表的映射文件中加
<sql-query name = "getlist" callable="true">
{call LIMING_ZZJHQR(?)}

</sql-query>

然后引用通过名称吗
Query query = session.getNamedQuery("getlist");

我那种方式为什么就不可以
皮皮 2011-07-06
  • 打赏
  • 举报
回复
Connection conn = getSession().connection();

CallableStatement stmt = conn.prepareCall("{Call LIMING_ZZJHQR()}");

这样的吧
im110 2011-07-06
  • 打赏
  • 举报
回复
SQLQuery query = session.createSQLQuery("{Call LIMING_ZZJHQR()}");
把这一句换成下面的试试:
Query query = session.getNamedQuery("Call LIMING_ZZJHQR");
lvze521lvze 2011-07-06
  • 打赏
  • 举报
回复
怎么没人你能回答下嘛
xiaomaha 2011-07-06
  • 打赏
  • 举报
回复

getHibernateTemplate().execute(new HibernateCallback(){

public Object doInHibernate(Session session) throws HibernateException, SQLException {
// TODO Auto-generated method stub
SQLQuery query = session.createSQLQuery("call 过程");
query.setParameter(0, "参数");
//..............多个略
return query.executeUpdate();
}});

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧