免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1905 | 回复: 0
打印 上一主题 下一主题

Sybase数据库BUG模拟(两个) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-17 22:35 |只看该作者 |倒序浏览
版本:12。5。4

1、数据库报列名混淆错误,模拟案例如下:
create table t1(x int not null)
go
insert into t1 values (1)
go
create proc p
as
select x into #temptable from t1
–select * from #temptable
select a.x from #temptable a join (select x from #temptable) b on a.x = b.x group by a.x
go
exec p
go
alter table t1 add n1 int default 0 NOT NULL
go
exec p
go
drop table t1
drop proc p
go

2、java调用数据库报内存溢出错误,模拟案例如下:
java程序调用机器核查存储过程使JVM产生java.lang.OutOfMemoryError错误,但是在isql环境中执行该存储过程却能正常执行,存储过程是一个后台批处理作业,不需要返回任何结果给客户端。

操作系统:Redhat Linux AS4
数据库:Sybase12.5.4
测试数据(sptest.sql):
drop table tbtest
go
create table tbtest(c1 char(30),c2 char(30),c3 char(30),c4 char(30),c5 char(30),c6 char(30))
go
drop procedure spTest
go
create procedure spTest
as
declare @switch int
declare @c1 Char(30)
declare @c2 Char(30)
declare @c3 Char(30)
declare @c4 Char(30)
declare @c5 Char(30)
declare @c6 Char(30)
declare @v_cRptNo Char(22)
declare @v_cMessage Varchar(12
select @switch=1
while (1=1)
begin
if @switch > 1000000
break
select @switch=@switch+1
select @c1 =’tbtest(c1 char(30)(30)’
select @c2 =’tbtest(c1 char(30)(30)’
select @c3 =’tbtest(c1 char(30)(30)’
select @c4 =’tbtest(c1 char(30)(30)’
select @c5 =’tbtest(c1 char(30)(30)’
select @c6 =’tbtest(c1 char(30)(30)’
begin tran t1
insert into tbtest values(@c1,@c2,@c3,@c4,@c5,@c6)
commit tran t1
end
truncate table tbtest
Error_Handler:
Go

测试代码(AseTest.java):
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
public class AseTest {
public static void main(String args[]) {
try {
Driver driver = (Driver) new com.sybase.jdbc3.jdbc.SybDriver();
DriverManager.registerDriver(driver);

String url = “jdbc:sybase:Tds:192.1.10.1:5010/db”;
Properties prop = new Properties();
prop.put(”user”, “user”);
prop.put(”password”, “password”);

Connection conn = DriverManager.getConnection(url, prop);
CallableStatement stmt = conn.prepareCall(”{call spTest}”);
stmt.execute();
System.out.print(conn.getTransactionIsolation());

} catch (SQLException ex) {
ex.printStackTrace();
} catch (java.lang.Exception ex0) {
ex0.printStackTrace();
}
}
}
测试结果:
java.lang.OutOfMemoryError
Exception in thread “main”

解决办法:
将stmt.execute();改为stmt.executeUpdate();就可以解决问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP