SYBASE程式設計中的莫名錯誤及其解決辦法

2021-04-18 04:30:55 字數 3477 閱讀 3768

01-5-25 下午 03:13:29

sybase 資料庫是當今在unix環境下最為流行的大型資料庫之一,本人在sybase下開發和維護軟體的過程中,發現了一些sybase的內部規則,在程式設計中極易造成誤解,而達不到預期的目的。下文將本人所發現的幾個問題及其解決辦法敘述如下:

1、在sybase11.5中,組合兩個定長的 char(x)="aaa",char (y)="bbb"; char(x)+char(y)!="aaabbb"

declare @val_1 char(8)

declare @val_2 char(1)

select @val_2 = 'x'

select @val_1 = "0000"

select @var_1= @val_1 + @val_2

select @var_1

我們期望的結果為0000x, 而實際上其結果為0000。

解決方法一:當我們將"select @var_1=@val_1+@val_2",改為"select @var_1=rtrim(@var_1)+@var_2"時,我們便看到了我們所期望的結果。為什麼呢?在有的sybase版本中儲存乙個char(n)時,在其真實值後補上了相應數量的空格,在本例中,儲存在@var_1中的是0000    (在0000後有四個空格)。你可以加上如下兩句來驗證:

declare @val3 char(10)

select @val3 = @val_1 + @val_2

select @val3

這時你會得到的結果為0000    x (在0000後有四個空格)

解決方法二:將char 改為 varchar 也可以達到預期的目的。

2、用alter table 增加表結構時,雖然用sp_recompile tablename 重編譯了所影響的資料庫物件,但在執行某些包含"select * from tablename"的儲存過程時,儲存程序仍不認識用alter table 增加的列。例:

1> create table tmp(aa int,bb int)

2> go

1> create table b_tmp(aa int,bb int)

2>go

1> create proc tmpstore

2> as

1> insert b_tmp select * from tmp

2> return

3> go

1> alter table tmp add cc char(8) null

2> go

1> alter table b_tmp add cc char(8) null

2> go

1> sp_recompile tmp

2> go

1>insert tmp values(12,1234,"abcdefg")

2>go

1> exec tmpstore

2> go

1> select * from b_tmp

2> go

aabbcc

----------- ------------- -------------

121234null

為什麼cc欄位是null,而不是"abcdefg"? 用alter table 增加表結構後,包含"select * from tablename"的儲存過程,用sp_recompile tablename 重編譯仍不能使新增的列被儲存過程所識別。解決辦法只有乙個:刪了重建。

01-5-25 下午 03:13:29

sybase 資料庫是當今在unix環境下最為流行的大型資料庫之一,本人在sybase下開發和維護軟體的過程中,發現了一些sybase的內部規則,在程式設計中極易造成誤解,而達不到預期的目的。下文將本人所發現的幾個問題及其解決辦法敘述如下:

1、在sybase11.5中,組合兩個定長的 char(x)="aaa",char (y)="bbb"; char(x)+char(y)!="aaabbb"

declare @val_1 char(8)

declare @val_2 char(1)

select @val_2 = 'x'

select @val_1 = "0000"

select @var_1= @val_1 + @val_2

select @var_1

我們期望的結果為0000x, 而實際上其結果為0000。

解決方法一:當我們將"select @var_1=@val_1+@val_2",改為"select @var_1=rtrim(@var_1)+@var_2"時,我們便看到了我們所期望的結果。為什麼呢?在有的sybase版本中儲存乙個char(n)時,在其真實值後補上了相應數量的空格,在本例中,儲存在@var_1中的是0000    (在0000後有四個空格)。你可以加上如下兩句來驗證:

declare @val3 char(10)

select @val3 = @val_1 + @val_2

select @val3

這時你會得到的結果為0000    x (在0000後有四個空格)

解決方法二:將char 改為 varchar 也可以達到預期的目的。

2、用alter table 增加表結構時,雖然用sp_recompile tablename 重編譯了所影響的資料庫物件,但在執行某些包含"select * from tablename"的儲存過程時,儲存程序仍不認識用alter table 增加的列。例:

1> create table tmp(aa int,bb int)

2> go

1> create table b_tmp(aa int,bb int)

2>go

1> create proc tmpstore

2> as

1> insert b_tmp select * from tmp

2> return

3> go

1> alter table tmp add cc char(8) null

2> go

1> alter table b_tmp add cc char(8) null

2> go

1> sp_recompile tmp

2> go

1>insert tmp values(12,1234,"abcdefg")

2>go

1> exec tmpstore

2> go

1> select * from b_tmp

2> go

aabbcc

----------- ------------- -------------

121234null

為什麼cc欄位是null,而不是"abcdefg"? 用alter table 增加表結構後,包含"select * from tablename"的儲存過程,用sp_recompile tablename 重編譯仍不能使新增的列被儲存過程所識別。解決辦法只有乙個:刪了重建。

SYBASE程式設計中的莫名錯誤及其解決辦法

01 5 25 下午 03 13 29 sybase 資料庫是當今在unix環境下最為流行的大型資料庫之一,本人在sybase下開發和維護軟體的過程中,發現了一些sybase的內部規則,在程式設計中極易造成誤解,而達不到預期的目的。下文將本人所發現的幾個問題及其解決辦法敘述如下 1 在sybase1...

SYBASE程式設計中的莫名錯誤及其解決辦法

01 5 25 下午 03 13 29 sybase 資料庫是當今在unix環境下最為流行的大型資料庫之一,本人在sybase下開發和維護軟體的過程中,發現了一些sybase的內部規則,在程式設計中極易造成誤解,而達不到預期的目的。下文將本人所發現的幾個問題及其解決辦法敘述如下 1 在sybase1...

段錯誤(Segment Fault )莫名的問題

段錯誤或段違規 segmentation violation 應該已經很清楚,之前有過一篇文章介紹過 段模型 在一般硬體中,段錯誤是由於 記憶體管理單元 負責支援虛擬記憶體的硬體 的異常所致,而該異常則通常是由於解除引用乙個未初始化或非法值的指標引起的。如果指標引用乙個並不位於你的位址空間中的位址,...