oracle 包如下:
create or replace package pkg_user as
type users is ref cursor;
function getUser return users;
end;create or replace package body pkg_user is
function getUser return users is
c_user users;
begin
open c_user for select * from tbl_users;
return c_user;
end;
end;在SQL*PLUS中测试可以成功,在Java中测试也成功。
但在jsp中调用的时候却出现以下错误:
java.lang.ClassCastException: org.apache.tomcat.dbcp.dbcp.DelegatingCallableStatement
jsp中的代码如下:
<%
Connection conn = DBPool.getPool().getConnection();
CallableStatement cstmt = conn.prepareCall("{?=call PKG_user.getUser()}");
cstmt.registerOutParameter(1,OracleTypes.CURSOR);
cstmt.executeQuery();
ResultSet rrs = ((OracleCallableStatement)cstmt).getCursor(1);
while(rrs.next()){
out.print(rrs.getString(1));
out.print(rrs.getString(2));
out.print(rrs.getString(3));
out.print("<br>");
}
conn.close();
%>出错的是加红的那一行,各位老大指点一下吧
create or replace package pkg_user as
type users is ref cursor;
function getUser return users;
end;create or replace package body pkg_user is
function getUser return users is
c_user users;
begin
open c_user for select * from tbl_users;
return c_user;
end;
end;在SQL*PLUS中测试可以成功,在Java中测试也成功。
但在jsp中调用的时候却出现以下错误:
java.lang.ClassCastException: org.apache.tomcat.dbcp.dbcp.DelegatingCallableStatement
jsp中的代码如下:
<%
Connection conn = DBPool.getPool().getConnection();
CallableStatement cstmt = conn.prepareCall("{?=call PKG_user.getUser()}");
cstmt.registerOutParameter(1,OracleTypes.CURSOR);
cstmt.executeQuery();
ResultSet rrs = ((OracleCallableStatement)cstmt).getCursor(1);
while(rrs.next()){
out.print(rrs.getString(1));
out.print(rrs.getString(2));
out.print(rrs.getString(3));
out.print("<br>");
}
conn.close();
%>出错的是加红的那一行,各位老大指点一下吧
exception org.apache.jasper.JasperException: Exception in JSP: /main/testpkg.jsp:3936: CallableStatement cstmt = conn.prepareCall("{?=call PKG_user.getUser()}");
37: cstmt.registerOutParameter(1,OracleTypes.CURSOR);
38: cstmt.executeQuery();
39: ResultSet rrs = ((OracleCallableStatement)cstmt).getCursor(1);
40: while(rrs.next()){
41: out.print(rrs.getString(1));
42: out.print(rrs.getString(2));
Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:451)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
root cause java.lang.ClassCastException: org.apache.tomcat.dbcp.dbcp.DelegatingCallableStatement
org.apache.jsp.main.testpkg_jsp._jspService(testpkg_jsp.java:108)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
note The full stack trace of the root cause is available in the Apache Tomcat/5.5.25 logs.
ResultSet rrs = ((OracleCallableStatement)cstmt).getCursor(1);
改成
ResultSet rrs = (ResultSet) cstmt.getObject(1);
这样就行了。