|
INTERBASE'E GİRİŞ
InterBase, kurulum, kullanım ve bakım kolaylıklarını tek bir üründe
birleştiren piyasadaki tek RDBMS’tir. InterBase size, geliştirilmiş
bir mimarinin gücünü, Java geleceğini ve uygulamalarınızın başarıya
ulaşabilmesi için gerekli olan gelişmiş teknolojiyi sunar.
InterClient - tümüyle-Java JDBC sürücüsü sizin istemciye güncelleme
zorunluluğundan kurtarır. Versioning Architecture okuma ve yazma
yapanlar birbirlerini hiçbir zaman bloke etmezler Etkin Veritabanı,
piyasada en çok özelliğe sahip olan tetikleme özelliğini içerir
Event Alerterlar – ile artık veritabanını kontrol etmek yok
Zengin veri tipleri - BLObs, çok-boyutlu diziler Dağıtık veritabanı
ortamları için tasarlanmıştır ANSI SQL 92 VAR program
ihtiyaçlarınıza uyacak şekilde biçimlendirildi.
Unicode Uluslararası Karakter Desteği:
InterBase, uygulama geliştiren küçük ölçekli firmalar için ucuz ve
kolayca kurulabilen bir çözüm oluştururken; hisse senedi işlemleri,
farmakoloji, uzay teknolojisi ve ağ yönetimi gibi kritik işler için
yüksek performans sunar. InterBase tam olarak entegre veritabanı
isteyen uygulama geliştiriciler için idealdir. InterBase’in belli
belirsiz izleri ve düşük bakım gerektirmesi (Veritabanı Yönetimine
gerek yoktur) müşterilerinizin InterBase’i varlığını hiç
farketmemelerini sağlayarak size rahatlık sağlayacaktır. InterBase
çekici fiyatına karşın farkedilebilir özelliklere sahiptir.
InterBase, size veritabanı dünyasının en iyilerini bir araya
getirerek ( trigger, BLOb, event-alerter ve Kullanıcı Tanımlı
Fonksiyonlar ) veritabanının bakımından başka şeylerle ilgilenme
zamanı sağlar. Versioning ve Optimizing Mimarisi performans
kazandırır
Multi-Generational Mimari:
IntetrBase sunucusu Multi-Generational Mimari üzerine inşa
edilmiştir. Multi-Generational Mimari hem işlem yapan hemde karar
veren kullanıcıya kendisine özgü Versioning motoru sayesinde hazır
bilgi sunulmasını sağlar. Genellikle veritabanı sunucuları yüksek
miktarda kısa, küçük ve basit işlemler olarak tanımlanan OLTP-Online
Transaction Processing tipi veritabanı işlemlerini desteklerler .
Oysa InterBase Versioning motoru bu eski kısa OLTP tipi işlemleri
desteklerken dünyadaki gerçek uygulamalar yarışında da yarışta
öndedir çünkü InterBase eş zamanlı olarak uzun zamanlı ve
karar-destek tipi işlemleri de desteklemektedir. Versioning motoru,
işlemlerin kayıtlar üzerinde kilite ihtiyaç göstermelerini her zaman
önler ve okuma/yazma yapılan işlemler sırasında birbirlerini bloke
etmelerini yani çakışma olmamasını sağlar. Diğer veritabanlarından
farklı olarak kilitsiz işlemler InterBase’de ek bir programlama
gerektirmediği gibi her sorgulama için zaman-uyumlu, tekrarlanabilir
sonuç sağlar. Yani InterBase versioning motoru uzun ve kısa süreli
işlemlerin aynı anda var olmasını ve tüm işlemlerin veriminin
artırılmasını sağlar.
Süper Sunucu Mimarisi:
SüperSunucu mimarisi performansı artırmak için Multi-Generational
Mimari ile çalışmaktır. SüperSunucu mimarisi performansı arttırır ve
özellikle kullanıcı sayısının fazla olduğu durumlarda sistem
kaynaklarının en iyi şekilde kullanımını sağlar. Size cevap süreleri
kısa olan daha fazla istemcinin sunucunuza bağlanmasını sağlar.
Şimdiye kadarki en yüksek performansı veren multi-thread,
paylaştırılmış sunucudur. Bu mimarinin temel amaçlarından bir tanesi
veritabanı istatistiklerini ve kullanıcı bilgilerini bir merkezde
toplamaktır. Bu daha sık kullanılan bilgiyi önbellekleyerek bilginin
alınması için gereken sürenin iyileştirilmesini sağlar. Ayrıca,
veritabanına yapılan istemlerin iyileştirilebilmesi için istemciden
gelen her talebi merkezi bir noktada saklar.
Java:
Java InterBase ile doğal olarak uyumludur. Javayı ilgi çekici kılan
basitlik, sağlamlık, taşınabilirlik ve esneklik gibi bir çok özellik
aynı zamanda InterBase’inde özelliklerindendir. Özellikle Borland
Jbuilder ile birleştirilince InterClient yüksek performanslı bir
JDBC bağlantısıdır. InterClient, applet olmasını sağlayan ve istemci
tarafına çalıştırılması için herhangi birşeyin kurulmasını
gerektirmeyen tam ve gerçek bir Java sürücüsüdür! InterClient kolay
kurulum demektir çünkü istemci makinelerini istemci kütüphaneleri
ile yapılandırmaya gerek kalmamaktadır. Aynı zamanda daha kolay
güncelleme de demektir; sunucu üzerinde yapılan veritabanı
güncellemelerinin istemci tarafınıda güncellemeyi gerektirmesi ile
ilgili kaygılar artık yok.
Kolay Bakım ve Yönetim:
Çoğu SQL veritabanı sunucu ürünleri genel olarak bakım gözardı
edilerek tasarlanmıştır ve tam bilgili bilgi işlem elemanlarının
kurmasına, bakımına, ayarlamasına ve yönetimine ihtiyaç duyar.
InterBase sadece performans için değil her çeşit veritabanı
geliştiricisine hitap edecek ve saatlerce süren bakım
gerektirmeyecek şekilde tasarlanmıştır. Sabit denetim gerektirmeyen
veya boyutunu değiştirebileceğiniz masaüstü veritabanı uygulamaları
gibi entegre uygulamalara ihtiyaç duyduğunuzda düşük bakım
gerektiren mukemmel bir çözümdür.
Birkaç Dakikada Kurulum:
InterBase tek bir komut ile kurulur. Çok az yer tutar ve yüzlerce
ayar yapmak zorunda kalmazsınız. InterBase düşük bakım gerektirecek
şekilde tasarlandığı için işlemlerinizi optimize eder.
Daha Az Masraf:
Ürününüzün masrafını düşünürken aşağıdaki konuları da dikkate
alınız:
InterBase bir çok RDBMS’ten daha az belleğe ihtiyaç duyar,
böylelikle yüksek performans sağlamak için daha fazla bellek satın
almanıza gerek kalmaz. InterBase’in küçük kodundan dolayı daha fazla
sürücü yerine ihtiyaç duymazsınız. InterBase endüstri standartlarına
uyduğu için çok kısa zamanda InterBase’de üretmeye
başlayabilirsiniz. Eğer farklı bir işletim sistemine geçmeyi
düşünürseniz, UNIX gibi, uygulamanızın veya veritabanınızın herhangi
bir nesnesini tekrar yazmak zorunda kalmadan kolaylıkla
taşıyabilirsiniz. Kısacası, InterBase ile yapılan bir ürünün diğer
RDBMS’lerden daha az maliyete mal olur.
BOOLEAN ALAN TANIMLANMASI
Normal olarak,
Interbase'de Boolean alan tipi yoktur ama bunu halletmek zor
degildir. Bunu çözümlemek için Domain tanımlamalısınız. Örneğin:
CREATE DOMAIN MYBOOLEAN AS
INTEGER
DEFAULT 0
NOT NULL
CHECK (VALUE BETWEEN 0 AND 1)
Peki Ben KDV Oranınını yada Iskontomu 1-100 arasında bir deger
vermek istersem..
CREATE DOMAIN YUZDEORAN AS
DOUBLE PRECISION
DEFAULT 0
NOT NULL
CHECK (VALUE BETWEEN 0 AND 100)
Not: Domain tanımı, sabit alan tipleri kullanıyorsanız işinizi
oldukça kolaylaştıracak bir düzenektir. Mesala CHR20 yani 20
Karekterli bir domain yaratarak istenilen field alanlara bu
atanabilir.
INTERBASE VE AUTOINCREMENT ALAN KULLANIMI
Not:
1. Kullanılabilecek Tool'lar: InterbaseWorkBench veya
IBExpert
2. Interbase FireBird kurulumu şart
3. Trigger ile oluşturma Before Insert yapılacak
begin
if (new.ILGILITABLO_PRIMARYKEY is null) then
new.ILGILITABLO_PRIMARYKEY = gen_id(GENERATORUNADI,1);
end
AutoIncrement alan için mutlaka triger yazmak şart değildir. Bu
işlem için sadece bir Generator yeterlidir. Borland Delphi'de
IBQuery Nesnesinin GeneratorField Alanını tıklayın ve Tabloya ait
Generatoru seçin ve tablonun arttırılacak olan Primarykey alanını
seçin ve OnPost tıklayın, son olarak "ok" deyin.
INTERBASE VE UDF
UDF,
kısacası database ile yaptıramadagımız matematiksel yada parse etme
işlemlerimizi rahatlıkla yaptırmamızı yarayan dll dosyalarıdır.
Bunları Delphi ile rahatlıkla yazabilirsiniz.UDF ile neler
yaptırabiliriz?
UDF ile aklınıza gelebilecek her türlü kolaylıgı saglayabilirsiniz.
Mesala Eger kişi veritabanı alanına dogum tarihini girerse ve siz
yaşını hesaplamak isterseniz bunu veritabanına
yaptırabilirsiniz.Aksi durumda bunu programınızdan kod yazarak
yapmak zorunda kalacaktınız. Peki, gerçekte kod yazmak dogru mu? Her
ikisi de aynı işlemi yapmasına ragmen kod yazmak dogru degildir.
Neden? Çünkü, SQL Explorer ya da başka programlar ile veri girilmek
istendiginde sizin programınız çalışmadıgından yaş
hesaplanmayacaktır oysa ki, UDF Kullanıldıgında başka programlardan
dogum tarihi girilmesine ragmen yaş hesaplama işlemi yapılır. Bu da
bizim Veritabanımızın daha stabil çalışması anlamına gelecektir. UDF
Kullanırken bazı noktalara dikkat edilmesi gerekir bunlardan en
önemlisi Null (Degersiz veya boş veri) alan kullanılmamasıdır.
Örnek:
CREATE TABLE CARI (
AD VARCHAR(32) NOT NULL,
SOYAD VARCHAR(32) NOT NULL,
FULL_ISIM COMPUTED BY
(CapitalizeUDF(AD || ' ' || SOYAD)) );
2.Önemli Nokta Kattiyen Null Alan çagırmayın
Örnek 1:
UPDATE tab
SET urun_type = LowerUDF (urun_type)
WHERE urun_type IS NOT NULL;
Örnek 2:
CREATE TRIGGER tr FOR tab BEFORE UPDATE AS
BEGIN
IF (NEW.urun_type IS NOT NULL) THEN
NEW.urun_type = LowerUDF (NEW.urun_type);
END
Örnek 3:
SELECT ID, Sin(ACI) AS SINE FROM tab WHERE ACI IS NOT NULL
UNION ALL
SELECT ID, CAST(NULL AS DOUBLE PRECISION) FROM tab WHERE ACI IS NULL;
UDF Kullanarak Trim Çekme (Yani Boşkukları atmak):
CREATE TRIGGER tr FOR tab BEFORE UPDATE AS
BEGIN
NEW.AD = TrimUDF (NEW.AD);
NEW.SOYAD = TrimUDF (NEW.SOYAD);
END
UDF De String olmayan Parametreyi Stringe çevirme:
Delphi Dll Kodu Mutlak Pozitif
function TEST_Abs (val: PChar): integer; stdcall;
begin
try
Result := Abs( StrToInt(val) );
except
Result := -1;
end;
end;
DECLARE EXTERNAL FUNCTION TEST_ABS
CSTRING(20)
RETURNS INTEGER BY VALUE
ENTRY_POINT 'TEST_Abs' MODULE_NAME 'UDF_Ornek';
SELECT I, TEST_Abs(I) FROM TAB;
I TEST_ABS
======== ========
5 5
-5 5
0 0
-1
Karakter uzunlugunu hesaplama Delphi Dll Kodu:
function TEST_TrimLen (val: PChar): integer; stdcall;
begin
Result := -1;
if val[0] = #0 then Exit;
Inc(val);
Result := Length(Trim(val));
end;
DECLARE EXTERNAL FUNCTION TEST_TRIMLEN
CSTRING(20)
RETURNS INTEGER BY VALUE
ENTRY_POINT 'TEST_TrimLen' MODULE_NAME 'UDF_Ornek';
SELECT X || '<', TEST_TrimLen('#' || X) FROM TAB2; TEST_TRIMLEN
=========== ============
ABCD< 4
EFGH < 4
XYZ < 3
< 0
-1
BLOB Alan Örnek:
Example
type
TBlob = record
GetSegment : Pointer;
BlobHandle : ^Integer;
SegmentCount : LongInt;
MaxSegmentLength : LongInt;
TotalSize : LongInt;
PutSegment : Pointer;
end;
PBlob = ^TBlob;
function TEST_BlobSize(inBlob: PBlob): integer; stdcall;
begin
Result := -1;
if (not Assigned(inBlob)) or
(not Assigned(inBlob^.BlobHandle)) then Exit;
Result := inBlob^.TotalSize;
end;
DECLARE EXTERNAL FUNCTION TEST_BlobSize
BLOB
RETURNS INTEGER BY VALUE
ENTRY_POINT 'TEST_BlobSize' MODULE_NAME 'UDF_Examples';
CREATE TABLE TAB3 (I INTEGER, B BLOB);
INSERT INTO TAB3 (I,B) VALUES (1, 'abc');
INSERT INTO TAB3 (I,B) VALUES (2, '');
INSERT INTO TAB3 (I,B) VALUES (3, NULL);
/* Note: Firebird can insert strings to blob fields directly. */
/* With InterBase you may need to use UDF for String->Blob
conversion. */
SELECT I, TEST_BlobSize(B) FROM TAB3;
I TEST_BLOBSIZE
======= =============
1 3
2 0
3 -1
UDF Dll Örnegi Delphi Kodu...
library udf_exp;
uses
SysUtils, DateUtils;
{$R *.res}
var
TrUpCaseTable : array [0..255] of Char;
procedure InitUpperCaseTable;
var
i : integer;
begin
for i := 0 to 255 do
if chr(i)='ı' then
TrUpCaseTable[i] := 'I'
else if chr(i)='i' then
TrUpCaseTable[i] := 'İ'
else
TrUpCaseTable[i] := AnsiUpperCase(chr(i))[1];
end;
procedure TrUpperCase(P : PChar; Len : Cardinal);
asm
push ebx
push esi
test edx,edx
jle @@Done
mov esi,offset TrUpCaseTable
mov ecx,eax
add ecx,edx
xor ebx,ebx
@@Loop:
mov bl,[eax]
mov bl,[esi+ebx]
mov [eax],bl
inc eax
cmp ecx,eax
jnbe @@Loop
@@Done:
pop esi
pop ebx
end;
function TrimBlanks(STR : pchar):PCHAR;stdcall;
var
ss : string;
begin
ss := string(STR);
trim(ss);
result := PCHAR(ss);
end;
function AdSoyad(Ad, Soyad : pchar):PCHAR;stdcall;
var
ss : string;
ss1 : string;
begin
ss := string(Ad);
ss1 := string(Soyad);
ss := trim(ss);
ss1 := trim(ss1);
result := PCHAR(ss + ' ' + ss1);
end;
function StrCat(Str1, Str2 : pchar):pchar;stdcall;
var
ss1, ss2, ss3 : string;
begin
ss1 := string(str1);
ss2 := string(str2);
ss3 := ss1+ss2;
result := pchar(ss3);
end;
function DosyaNo(ID, MAHALLE_ID : Pointer; MAHALLE : PCHAR) : pchar;
stdcall;
begin
result := pchar(IntToStr(Integer(MAHALLE_ID^)) + '_' + IntToStr(Integer(ID^)));
end;
function YearOld(Birthday: PCHAR) : integer; stdcall;
const
month : array [1..12] of string=('JAN', 'FEB', 'MAR', 'APR', 'MAY',
'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC');
var
i : integer;
dt : string;
mS : string;
d, m : integer;
begin
dt := string(Birthday);
dt := copy(dt, 1, pos(' ', dt)-1);
d := StrToInt(copy(dt,1,pos('-', dt)-1));
delete(dt, 1, pos('-', dt));
ms := copy(dt,1,pos('-', dt)-1);
for i:= 1 to 12 do
if ms = month[i] then break;
m := i;
delete(dt, 1, pos('-', dt));
result := StrToInt(dt);
result := YearOf(date) - result;
if result > 0 then
if (m>MonthOf(date))or((m=MonthOf(date))and(d>DayOfTheMonth(date)))
then dec(result);
end;
exports
TrimBlanks, StrCat, DosyaNo, YearOld, AdSoyad;
begin
InitUpperCaseTable;
end.
INTERBASE VE
COMPUTED BY
Computed By'lar sanal
alanlardır. Bunları, bilgi çagırmak veya mevcut alanlarınızda
hesaplama yaptırmak için kullanabilirsiniz.
Örnek:
Tablo Adı Deneme
ID Integer
Ad String
Soyad String
AdSoyad /* Ad Soyadı Birleştirme Computed By*/
Borc Double Pression
Alacak Double Pression
Sonuc /* Hesaplama Computed By */
/* Ad Soyad Birleştirme Computed by cümlesi */
(Ad || ' ' || Soyad)
/* Sonuç Hesaplama Computed By */
(Borc-Alacak) veya (Borc*Alacak) veya ((Borc-Alacak)/100)
(Borc/Alacak) vs .. vs
Computed By'lar hiçbir veri alanı tutmazlar ve bizim için
mükemmellerdir. Bunun Daha ilerisi UDF'dir.
Sanal alanlarda (Computed by'larda) sql cümleleri kullanılması
mümkündür. Mesala, detay tablomdaki bir Computed By cümlesi Select
ACIKLAMA from Master Where ID=detay.ID gibi veya Select Sum(Borc)From
Detay Where Id=:Master.Id gibi..
Buradaki 1.Computed By'ın anlamı, detayın açıklama alanını master
tablosundan al demektir. 2.Computed By cümlesi ise detay
tablosundaki borc alanının toplamını al ve master tablosuna yansıt
demek oluyor. Burada en önemli özellik, Computed by'dır. cümlesi
kullanılan alanların tipleri belirtilmez mesala(integer,varchar vs..
vs..) gibi
Peki yazılan stored procedurlerinizi Computed by ile çagrılacagını
biliyor muydunuz??
CREATE PROCEDURE DOVIZKUR (INPDOVIZID Integer) returns (ALIS Double
Precision, SATIS Double Precision) AS
/*
Procedure: DOVIZKUR
Author : Kemal GÜLOL
Date : 04.11.2002 11:45:54
Purpose :
Date :
Changed :
*/
BEGIN
ALIS=0;
SATIS=0;
FOR
SELECT ALISKURU,SATISKURU FROM DOVIZKURUTABLE
WHERE DOVIZKURUTABLE.DOVIZID=:INPDOVIZID AND ALISKURU IS NOT NULL
AND SATISKURU IS NOT NULL ORDER BY TARIHSAAT DESC
INTO :ALIS,:SATIS
DO
SUSPEND;
END
bu prosedurde bir input, 2 tane de outputumuz mevcut. Şimdi Computed
By alanından bu procedurumuzu çagıralım ve sonucunu alalım..
Sanal bir alan oluşturun ve computed by cümlesi olarak bu kodu
yazın:
SELECT SATIS FROM DOVIZKUR(DOVIZTABLE.DOVIZID)
Not: Computed Alanlarda Null olmamasına özen gösterin çünkü;
2 Computed Alan sonucunu matematiksel işleme sokarsanız ve Computed
by lardan birtanesi null gelirse sonuç null olur.Bu da hatalı bir
sonuç olacaktır.

|