在11gz中创建了一个过程,由Java调用,中间老是报这个错:[code="java"]java.sql.SQLException: 类型长度大于最大值[/code]
大家可不可以帮忙看看?使用的是ojbdc14.jar,网上有文章说,是驱动问题,可是换了ojdbc5.jar、ojdbc6.jar都试过,也还是有这个问题。
谢谢各位了。
程序所要实现的功能是这样的:
编写一个过程,输入部门号,返回该部门下所有员工的信息,并用Java调用。
数据在emp表中
Oracle11g创建存储过程代码如下:
[code="java"]
--建包
create or replace package t_pac_page as
--定义一个名为test_cursor的游标
type test_cursor is ref cursor;
end t_pac_page;
/
--建过程
create or replace procedure t_page
(p_deptno in number,p_cursor out t_pac_page.test_cursor) is
begin
open p_cursor for select * from emp where deptno=p_deptno;
end t_page;
/
[/code]
Java调用过程的代码如下:
[code="java"]
public static void main(String[] args)
{
Connection conn = null;
CallableStatement stmt = null;
try
{
Class.forName(className);
conn = DriverManager.getConnection(url, user, password);
String sql = "{call t_page(?,?)}";
stmt = conn.prepareCall(sql);
stmt.setInt(1, 10);
stmt.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR);
stmt.execute();
ResultSet rs = (ResultSet)stmt.getObject(2);
while(rs.next())
{
System.out.println(rs.getInt(1) + " " + rs.getInt(2) + " " + rs.getInt(3));
}
stmt.close();
conn.close();
System.out.println("........");
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
try
{
if (stmt != null)
stmt.close();
if (conn != null)
conn.close();
}
catch (Exception e)
{
}
};
}
[/code]
这两行是没问题的,使用全局变量中定义好的className、url、user、password
[code="java"]
Class.forName(className);
conn = DriverManager.getConnection(url, user, password);
[/code]
执行后,就报后边这个错:
[code="java"]
java.sql.SQLException: 类型长度大于最大值
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:125)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:162)
at oracle.jdbc.driver.DatabaseError.check_error(DatabaseError.java:885)
at oracle.jdbc.driver.T4CMAREngine.buffer2Value(T4CMAREngine.java:2231)
at oracle.jdbc.driver.T4CMAREngine.unmarshalUB2(T4CMAREngine.java:1048)
at oracle.jdbc.driver.T4CTTIdcb.receiveCommon(T4CTTIdcb.java:112)
at oracle.jdbc.driver.T4CTTIdcb.receiveFromRefCursor(T4CTTIdcb.java:104)
at oracle.jdbc.driver.T4CResultSetAccessor.unmarshalOneRow(T4CResultSetAccessor.java:165)
at oracle.jdbc.driver.T4CTTIrxd.unmarshal(T4CTTIrxd.java:788)
at oracle.jdbc.driver.T4CTTIrxd.unmarshal(T4CTTIrxd.java:705)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:527)
at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:180)
at oracle.jdbc.driver.T4CCallableStatement.execute_for_rows(T4CCallableStatement.java:783)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1028)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:2888)
at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:2979)
at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:4103)
at com.uu.test.oracle.test.PageTest.main(PageTest.java:37)
[/code]
困扰好久了,一直没找到是哪的问题。看到这篇文章的,如能停留一下目光。真的会非常感谢
驱动问题
首先,第20行有两个错误:
System.out.println(rs.getInt(1) + " " + rs.getInt(2) + " " + rs.getInt(3));
应该改为:
System.out.println(rs.getInt(1) + " " + rs.getString(2) + " " + rs.getStirng(3));
因为emp表中第二个字段ename 是varchar2(10),第三个字段job是varchar2(9),所以在结果集中应该用getString获得。
你的pl/sql存储过程应该没问题,运行程序之前一定要确保oracle驱动已经导入了,我改了一下你程序中的第20行就没问题了
运行的结果是这个:
7782 CLARK MANAGER
7839 KING PRESIDENT
7934 MILLER CLERK
........
我用的就是odbc6.jar,改了,第20行后就正常运行了,应该不是驱动的问题。
2楼说的对
System.out.println(rs.getInt(1) + " " + rs.getInt(2) + " " + rs.getInt(3)); 这这个问题 超过int最大值了