Üye Kayıt Üye Giriş

INTERBASE'E GİRİŞ


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.

Bilgisayar Dershanesi Ders Sahibi;
Bilgisayar Dershanesi

Yorumlar

Yorum Yapabilmek İçin Üye Girişi Yapmanız Gerekmektedir.

ETİKETLER