firebird可以說(shuō)是這個(gè)世界上最小的支持存儲(chǔ)過(guò)程的數(shù)據(jù)庫(kù)。
Firebird是一個(gè)跨平臺(tái)的關(guān)系數(shù)據(jù)庫(kù)系統(tǒng),目前能夠運(yùn)行在Windows、linux和各種Unix操作系統(tǒng)上,提供了大部分SQL-99標(biāo)準(zhǔn)的功能。它既能作為多用戶(hù)環(huán)境下的數(shù)據(jù)庫(kù)服務(wù)器運(yùn)行,也提供嵌入式數(shù)據(jù)庫(kù)的實(shí)現(xiàn)。
Firebird脫胎于Borland公司的開(kāi)源版數(shù)據(jù)庫(kù)Interbase6.0,是一個(gè)完全非商業(yè)化的產(chǎn)品,用C和C++開(kāi)發(fā)。由于與 interbase的血緣關(guān)系,大部分interbase的開(kāi)發(fā)工具可以直接應(yīng)用到Firebird開(kāi)發(fā)中。Firebird使用Mozilla Public License v.1.1許可證發(fā)行。
更新日志:
Firebird 發(fā)布了 3.0 的首個(gè) Alpha 版本,這是 Firebird 下一代的版本。
Firebird 2.5.2 RC1 發(fā)布,主要是一些問(wèn)題的修復(fù)和少許的改進(jìn)。
firebird經(jīng)驗(yàn)總結(jié):
1.自定義函數(shù)問(wèn)題.Access to UDF library "rfunc.dll" is denied by server administrator
花了很長(zhǎng)時(shí)間,不明白為何,將rfunc.dll拷到udf目錄,bin目錄,windows\system32目錄都不能解決問(wèn)題,google一下, 網(wǎng)上有同樣的問(wèn)題,但沒(méi)有解決方案,結(jié)果我重裝了一下firebird就解決了.
2.存儲(chǔ)過(guò)程中變量的定義
ms sql存儲(chǔ)過(guò)程中無(wú)論在哪都可以定義新的變量,但在firebird中,只能在as 與begin之間進(jìn)行定義.firebird的變量不能用@符號(hào),我將@全部變成a就好了.
3.存儲(chǔ)過(guò)程中變量的使用
select @i=count(*) from table1 //ms sql
select count(*) from table1 into :i//firebird引用變量使用冒號(hào)
4.嵌入式sql,
firebird支持select * from table exists (select ...) 或 select * from table in (select ...)
但不支持select * from (select * from ...) a,
我是將這類(lèi)改寫(xiě)成視圖解決的
5.case語(yǔ)句
mssql 可使用field= case (),但firebbird僅支持case () as field
6.mssql getdate()變成CURRENT_DATE+CURRENT_TIME
select * from snartleave where dt_starttime<CURRENT_DATE+CURRENT_TIME
或
select * from snartleave where dt_starttime<CURRENT_DATE||' ' ||CURRENT_TIME
7.返回?cái)?shù)據(jù)集的存儲(chǔ)過(guò)程寫(xiě)法(firebird寫(xiě)法有點(diǎn)麻煩)
CREATE PROCEDURE SPVARTST2 (
VAR_IPTARTNO CHAR(6))
RETURNS (
VAR_ARTNAME CHAR(10))
AS
begin
for select v_name1 from snart where v_artNo=:var_iptartno into :var_artname do
suspend;
end
8.自動(dòng)增長(zhǎng)字段的使用(autoincrement)
firebird有個(gè)發(fā)生器(generator)的東東,在發(fā)生器里記錄值的增長(zhǎng),
再用觸發(fā)器實(shí)現(xiàn)
begin
if (new.i_seqno is null) then
begin
NEW.i_seqno = GEN_ID(GEN_T_DB_ARTSEQNO_ID,1);
end
end
GEN_T_DB_ARTSEQNO_ID就是創(chuàng)建的發(fā)生器,看到?jīng)]有,也就是說(shuō)不同的表不同的字段可以共用一個(gè)發(fā)生器,gen_id相當(dāng)于 identity,看起來(lái)比mssql復(fù)雜,其實(shí)也很簡(jiǎn)單。
9.發(fā)生器重置mssql里自動(dòng)增加的字段要重置好像很麻煩,較難控制,
firebird可以這樣(存儲(chǔ)過(guò)程中)
agenerator=Gen_ID(GEN_T_DB_ARTSEQNO_ID,Gen_ID(GEN_T_DB_ARTSEQNO_ID,0)*-1+1);
//agenerator是一個(gè)整形變量,好像一定要裝gen_id的值符給一個(gè)變量才行,不知道有沒(méi)有更好的辦法,不用定義一個(gè)多余的變量
可參考如下網(wǎng)址:http://www.fingerbird.de/generatorguide_body.htm
10 通過(guò)一個(gè)表更改另一個(gè)表的數(shù)據(jù)
mssql:update table1 set cname=b.cname from table1 a inner join table2 as b where a.id=b.id
firebird:update table1 a set cname=(select cname from table 2 b where b where a.id=b.id)
11.如何選擇前幾條記錄
mssql: select top 10 * from table1
firebird:select first 10 * from table1
IB:select * from table rows 10
12.Firebird存存儲(chǔ)過(guò)程中的事務(wù)
在存儲(chǔ)過(guò)程 ib/fb 不支持開(kāi)事務(wù)或者結(jié)束事務(wù)。提交是由調(diào)用者提交的。也就是,fb/ib存儲(chǔ)過(guò)程應(yīng)該設(shè)計(jì)在一個(gè)事務(wù)里。
在sql server里,存儲(chǔ)過(guò)程或以開(kāi)這樣的事務(wù):
begin trancstion
commit trancstion
但在fb/ib里沒(méi)有這樣的事務(wù) ,需要在調(diào)的程序中開(kāi)事務(wù),如:
pFIBDtbsMain.StartTransaction;
pFIBDtbsMain.Commit;