关于jdbc调用存储过程的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于jdbc调用存储过程的问题相关的知识,希望对你有一定的参考价值。
环境是eclipse+tomcat+sql server 2005
编写了一存储过程,最后是select一个临时表,奇怪的是在jsp中用jdbc方式调用会出错
javax.servlet.ServletException: com.microsoft.sqlserver.jdbc.SQLServerException: 该语句没有返回结果集。
但是用jdbc-odbc方式调用就能成功。望不吝赐教
jdbc调用代码:
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String connStr="jdbc:sqlserver://localhost:1433;DatabaseName=testDatabase";
Connection conn=DriverManager.getConnection(connStr,"sa","******");
String callExchangeMoneyStr="call exchangeMoney1(1,2,100)";
CallableStatement procedure=conn.prepareCall(callExchangeMoneyStr);
ResultSet rs = procedure.executeQuery();
jdbc-odbc调用:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String connStr="jdbc:odbc:connSQL";
Connection conn=DriverManager.getConnection(connStr,"sa","601038");
String callExchangeMoneyStr="call exchangeMoney1(1,2,100)";
CallableStatement procedure=conn.prepareCall(callExchangeMoneyStr);
ResultSet rs = procedure.executeQuery();
JDBC驱动装好了的,数据库配置没问题,因为如果不调用存储过程,执行普通的sql语句完全没有问题。
这个要导包才可以用的,你先写com再按一下"."看有没有microsoft
没有的话就是没导入sqljdbc.jar这个包
com.microsoft.sqlserver.jdbc.SQLServerDriver
还有,如图:看看你的TCP/IP设置是否开启,并且看看端口号正确与否,
如果开启了,端口号也对了,那我就不知道啦! ╮(╯_╰)╭
参考技术A 给你看个例子吧!Connection con = null;
CallableStatement cs = null;
try
// 连接数据库
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
con = DriverManager
.getConnection("jdbc:sqlserver://localhost:1433;databaseName=temp;user=sa;password=sa");
System.out.println("连接数据库成功");
// 定义一个CallableStatement对象,用来准备执行数据库中的testpro存储过程!
// testpro存储过程有两个参数第一个是输出参数,第二个是输入参数;
cs = con.prepareCall("call testpro(?,?)");
// 输出参数需要注册数据类型
cs.registerOutParameter(1, Types.INTEGER);
// 给in输入参数赋值
cs.setInt(2, 1);
// 执行该存储过程
cs.execute();
// 接收存储过程的输出参数,并打印out参数出来
int strAge = cs.getInt(1);
System.out.println("通过存储过程获取到的编号为1的学生年龄是:" + strAge);
catch (Exception e)
System.out.println("程序出现异常,异常信息如下:");
System.out.println(e.getMessage());
finally
if (cs != null)
try
cs.close();
catch (SQLException e)
e.printStackTrace();
if (con != null)
try
con.close();
catch (SQLException e)
e.printStackTrace();
参考技术B 那说明sun的驱动比SQLServerDriver的兼容性好啊
你要用jdbc,就得按标准的jdbc来跑,execute就够了,别用executeQuery…… 参考技术C 首先你要定位你的错误在哪儿?可以在jsp中加一些调试代码,在jsp中访问数据库还没有这样用过。 参考技术D 存储过程的语句呢?
有没有output?
JDBC取消Oracle存储过程调用
【中文标题】JDBC取消Oracle存储过程调用【英文标题】:JDBC cancel Oracle stored procedure call 【发布时间】:2015-04-20 11:19:44 【问题描述】:我有一个非常复杂的 oracle 存储过程来搜索和检索一些数据。该过程返回一个输出参数 - 一个 oracle 游标。 我通过 JDBC 执行程序:
CallableStatement stmt = conn.prepareCall("call myprocedure(?,?,?,?");
问题是,查询有时可能需要很长时间(几分钟),我希望用户能够通过单击按钮随时取消查询。 我引用了 stmt 对象,但不幸的是(从其他线程)调用 stmt.cancel() 没有效果。
另一方面,当我将 CallableStatement sql 更改为以下查询时:
CallableStatement stmt = conn.prepareCall("select * from all_objects");
我在调用 stmt.cancel() 后得到“java.sql.SQLTimeoutException: ORA-01013: 用户请求取消当前操作” - 所以这是正确的反应。
这是否意味着我不能通过 jdbc 取消存储过程调用,而只能取消简单的 select 语句? 有没有其他人遇到过并解决过类似的问题?
我想我可以通过 oracle kill session 取消查询,但我使用连接池 (jboss),并且我有很多会话可供同一用户使用。
数据库产品版本是 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production JDBC 驱动程序版本为 11.2.0.4.0
我们将不胜感激。
【问题讨论】:
我也有同样的问题。你找到解决办法了吗? 【参考方案1】:该过程是只读的还是写入了一些数据?尝试在数据库级别跟踪该会话并查看跟踪文件。您还可以检查该特定会话的 v$undostat(used undo blocks)。 OCIBreak 调用不会回滚会话,但可能会回滚被中断的语句。
即使您终止会话,它也不会立即终止。它只是有状态 KILLED 并且它会在它真正死亡之前回滚所有内容。
如果 v$undostat 中的“使用的撤消块”在增加,则会话正在“做某事”。如果它正在减少,则会话正在回滚并且您没有其他选择,然后等待它完成。
已编辑:在 OCI 中,OCIBreak 调用被实现为带外数据包。它使用 TCP 标头中的特殊字段。使用 tcpdump 可以轻松识别此类数据包。因此,即使您没有必要的权限。在数据库方面,您至少可以验证 Break 数据包已发送到数据库。
当您 100% 确定中断已发送到数据库时,您必须在数据库服务器端进行调查。我认为有些 DDL 语句,比如“drop user cascade”,是不能被打断的。
【讨论】:
以上是关于关于jdbc调用存储过程的问题的主要内容,如果未能解决你的问题,请参考以下文章