xmltiger 发表于 2009-03-17 22:35

Sybase数据库BUG模拟(两个)

版本: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(128)
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();就可以解决问题
页: [1]
查看完整版本: Sybase数据库BUG模拟(两个)