2 msx985211 msx985211 于 2016.04.26 22:13 提问

Java执行删除/创建临时表的存储过程时,获取的影响行数总是-1,求大师指点

如题所述,使用Java代码执行删除、创建临时表的存储过程时总是执行不成功(不报错,
但是获取的影响行数为-1),别的存储过程都可以执行成功,求大师指点啊,
存储过程和Java代码如下:
1、存储过程代码
ALTER PROCEDURE [dbo].[PROC_TEMP]
AS
BEGIN
if object_id('tempdb..##temp') is not null
Begin

DROP TABLE ##temp
End

select identity(int) id0,* into ##temp from AlarmRecordRe ORDER BY [TIMESTAMP] DESC
END

2、Java代码
String sql = "{call PROC_TEMP}";
CallableStatement proc = conn.prepareCall(sql);
proc.execute();
int tmp = proc.getUpdateCount();
System.out.println(tmp);//这里打印出来的总是-1
if (tmp<0)
{
System.out.println("存储过程执行失败");
proc.close();
DBPool.destroyConnection(conn);
return;
}
System.out.println("成功了啊");
proc.close();

5个回答

w172087242
w172087242   Ds   Rxr 2016.04.27 21:45
已采纳

执行动态语句的话:

mysql:
create procedure p_drop_table_if_exist_v2(p_table_name varchar(20))
begin
declare v_table_name varchar(20);
declare exit handler for not found begin end;
select distinct table_name into v_table_name from information_schema.columns WHERE table_name = p_table_name;
if length(v_table_name)>0 then
set @sql=concat('drop table ', p_table_name);
prepare dtb from @sql;
execute dtb;
deallocate prepare dtb;
end if;

end;
//

oracle:
procedure p_drop_table_if_exist_v2(p_table_name in varchar2)
is
v_table_name varchar2(20);
begin
select table_name into v_table_name from user_tables where table_name=upper(p_table_name);

if length(v_table_name)>0 then
execute immediate 'drop table ' || p_table_name || ' purge';
end if;

exception
when no_data_found then
begin
null;
end;

msx985211
msx985211 回复little_how: 我还没找到呢。用sqlserver的公司也不少啊,相比一些重量级的要通俗易懂
大约 2 年之前 回复
w172087242
w172087242 回复msx985211: 对sqlserver的动态语句执行没研究,但网上应该有,现在很多公司用sqlserver吗?
大约 2 年之前 回复
msx985211
msx985211 你这里面也没有sqlserver的啊
大约 2 年之前 回复
devmiao
devmiao   Ds   Rxr 2016.04.26 23:05
msx985211
msx985211 谢谢你的回答,我试过你的这个方法,但获取的影响行数依然是-1啊
大约 2 年之前 回复
woerry
woerry   2016.04.26 23:44

单独运行存储过程里的SQL显示的是对的?

msx985211
msx985211 单独运行没有错,影响行数与表内数据行数相等
大约 2 年之前 回复
w172087242
w172087242   Ds   Rxr 2016.04.27 09:43

##temp是变量吗?
如果是变量就不能这么执行;
还有数据库是什么呢?

msx985211
msx985211 ##temp是变量啊,如果不这样执行哪有啥好方法呢,求指点
大约 2 年之前 回复
msx985211
msx985211   2016.04.27 20:10

自己先顶一下帖子,哪位大师指点一下,感激不尽

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
c# 执行ORACLE存储过程并返回行数
            using (OracleConnection connection = new OracleConnection(connectionString))            ...{                OracleCommand Ocmd = new OracleCommand("存储过程名", connection);               //执
存储过程中返回影响行数
存储过程中判断一条修改或删除语句执行是否成功 If sql%rowcount=0  then 如过修改或删除成功,then后面的语句就不会执行,如过影响行数为0,将执行then后面的语句。
SQL存储过程返回受影响的行数
在很多时候,使用存储过程,不需要返回数据集, 但是经常想知道存储过程是否对数据库有影响; 这些,只需要将下列数据放在你需要统计的语句后面即可; select @@ROWCOUNT
存储过程正确返回受影响的行数
-
如何解决存储过程中关联临时表时快时慢的情况
调用一个存储过程,同样的条件,数据库负载也是正常的情况下,时快时慢。原因是数据库无法获取临时表的统计信息,导致执行计划会走错。之前写过一个帖子,被临时表坑了,http://blog.csdn.net/stevendbaguo/article/details/39964807,就是用hint /*+ dynamic_sampling(T 10) */ 来做动态采集,这种解决方案实践证明还是没
mysql中的存储过程使用事物后如何正确得到影响行数
已知MySQL的存储过程中使用事物后,执行commit操作时会返回0 row(s) affected, 但是增删改已经正确执行了。 那么实际应用中一定要这个影响行数确认执行结果怎么办? 此时需要手动实现影响行数计数,然后在commit之前输出计数。 具体做法是利用row_count()。 每次增删改语句执行后,row_count()都会返回上一次影响行数, 设置一个变量接收这个函数的返回
不创建表结构,直接放入临时表结果(包括存储过程,直接sql语句)
首先介绍一下临时表的分类:临时表有两种    1,加#只有该会话可见,并且该会话结束后SQL   SERVER自动删除    2,加##全局。所有会话结束后SQL   SERVER   删除它  全局临时表   ##tablename   可以由任何进程访问。    所以要在asp中使用临时表,就要使用全局临时表,把你的存储过程中的局部临时表改成全局就可以。但临时表确实存在生存周期短的问题
mysql 存储过程:提供查询语句并返回查询执行影响的行数
mysql 存储过程:提供查询语句并返回查询执行影响的行数 DELIMITER $$ DROP PROCEDURE IF EXISTS `p_get_select_row_number`$$ CREATE PROCEDURE `test_cases`.`p_get_select_row_number`(IN p_select_sql VARCHAR(500), OUT p_count IN...
Oracle带输入、输出参数的存储过程 返回受影响的行数 SQL%ROWCOUNT
CREATE OR REPLACE PROCEDURE PROC_UPDATE_TEMP(P_DAYS IN NUMBER, --执行天数 P_ROWS OUT VARCHAR2, --返回受影响的行数
SQL Server数据库的存储过程中定义的临时表,真的有必要显式删除(drop table #tableName)吗?
问题背景 在写SQL Server存储过程中,如果存储过程中定义了临时表, 有些人习惯在存储过程结束的时候一个一个显式地删除过程中定义的临时表(drop table #tName),有些人又没有这个习惯, 对于不明真相的群众或者喜欢思考的人会问,存储过程中定义的临时表,最后要不要主动删除,为什么? 或者说是不是存储过程结束的时候删除临时表更加规范? 不止一个人问过这个问题了,说实在话