OO4O-Oracle Objects For OLE
Bu başlık altında ASP kullanarak Oracle veritabanına erişmek için Oracle tarafından
geliştirilmiş farklı bir teknik kullanacağız. Bu tekniği kullanırken diğer örneklerimizde
olduğu gibi VBScript kullanacağız.
OO4O herhangi bir programlama dilinden ya da scripting dillerinden Oracle
veri tabanına erişerek daha kolay uygulama geliştirmek için dizayn edilmiş bir
Oracle ürünüdür. Bir programlama dili içerisinden bu ürünü kullanabilmek için,
ilgili programlama dilinin Microsoft COM Automation ve ActiveX olarak adlandırılan
teknolojileri desteklemesi gerekir. Visual Basic, Visual C++, IIS Active Server
Pages(VBScript,JavaScript) dilleri bu desteği verir.
OO4O üç ürün içerir. Birincisi OO4O Automation Server’dır. Bu ürün veritabanına
bağlanıp, SQL ve PL/SQL komutlarını çalıştırmak için gereken nesneleri kapsar.(Bunlar
COM Automation Objects olarak adlandırılan nesnelerdir.) İkincisi Oracle Data
Control ‘dür. Bu üründe yukarıda bahsettiğimiz görsel dillerdeki edit, text,
list ve grid vb. kontrolleri ile Oracle veritabanı arasında veri alışverişi
sağlamak için geliştirilmiş ActiveX kontrolüdür. Üçüncü ürün ise Oracle Objects
for OLE C++ Class Library olarak adlandırılan üründür ve bu da Microsoft Visual
C++’den Oracle veritabanı erişimi için geliştirilmiş sınıf kütüphanelerini içerir.
OO4O istemcideki uygulamaların sunucuya erişip komut çalıştırmalarını ve komutların
sonuçları üzerinde işlem yapmalarını sağlar. OO4O kullanarak yazdığımız tüm
uygulamalarda aşağıdaki adımları sırayla gerçekleştirmeliyiz:
• OO4O Automation Server’ eriş
• Oracle Database Server’a bağlan
• Komutları çalıştır ve sonuçları al
• Server bağlantılarını kapat ve kullanılan OO4O nesnelerini bellekten sil
OO4O Aoutomation Server’a erişmek için OraSession nesnesi kullanılır:
<%Set OO4OSession = CreateObject(“OracleInProcServer.XOraSession")%>
Burada OO4Osession bir değişken ismidir. “CreeateObject” ise VBScript’in bir
fonksiyonudur. Bu fonksiyon içerisine girdiğimiz parametrelerle OO4O Automation
Server’a erişiyoruz. Oracle Databease Server’a bağlanmak için OpenDatabase metodu
kullanılır:
<%Set isciDb= OO4ODBSession.OpenDatabase("ogr", "usr_esef/esef",
0)%>
Burada “ogr” veritabanımızın SID olarak da adlandırılan ismidir. Bu işlemden
sonra veritabanı işlemleri için “isciDb” değişkeni kullanılabilecek. “usr_esef”
kullanıcı adı ve “esef” de bu kullanıcının şifresi. Buraya kadar yaptığımız
işlemleri OraServer nesnesini kullanarak biraz farklı yazım şekliyle gerçekleştirebiliriz:
<%Set OO4OServer = CreateObject("OracleInProcServer.XOraServer")
OO4OServer.Open("ogr")
Set isciDbSession1 = OO4OServer.OpenDatabase("usr_esef/esef")
Set isciDbSession2 = OO4OServer.OpenDatabase("usr_gef/gef")%>
Yukarıda verdiğimiz komutlarla veritabanı bağlantısını sağlamış oluyoruz. Bundan
sonra veritabanı üzerinde çalıştıracağımız komutların nasıl kullanılacağını
anlatacağız. OO4O’nun Oracle veritabanı üzerinde çalıştırılabilen komutları;
sorgular, UPDATE, DELETE,INSERT gibi veri işleme dili komutları(DML), PL/SQL
komutları, veri tanımlama dili(DDL) komutları ve birden fazla sorgunun çalıştırılması
olarak adlandırılan transaction kontrol komutları olarak sınıflandırılır.
OO4O’de bir sorgu çalıştırmak için CreateDynaSet metodu kullanılır. Bu metod
çalıştırıldığında OraDynaset nesnesi oluşturulur. Bu nesne sorgu komutunun döndürdüğü
kayıtları içeren bir “recordset” nesnesi gibidir. OraDynaset nesnesi üzerinde
bir sonraki kayda git, bir önceki kayda git vb. gibi kayıtlar üzerinde hareket
etme işlemlerini gerçekleştirebiliriz.
Set OO4OSession = CreateObject(“OracleInProcServer.XOraSession")
<%Set isciDb = OO4OSession.OpenDatabase("ogr", "usr_esef/esef",
0 )
Set isciler = isciDb.CreateDynaset("SELECT isciadi, iscino FROM
isci",ORADYN_NOCACHE)
While NOT isciler.EOF
------ ‘işlem komutları
yedek=isciler("isciadi")
------
isciler.MoveNext
Wend%>
Burada isciler(“isciadi”) yazım şekliyle tablonun geçerli olan kayıttaki alan
değerleri elde edilebilir. Oluşturduğumuz OraDynaSet nesnesi “isciler” değişkeni
ile temsil edilmekte. Bu kayıt setinin “isciler.EOF” komutuyla sonuna gelip
gelinmediği kontrolü yapılıyor. “isciler.MoveNext” komutuyla bir sonraki kayda
geçiliyor. Burada MoveFirst, MoveLast, MoveNext, MovePrevious, MoveNextn, MovePreviousn,
MoveRel, ve MoveTo komutları da kullanılabiliyor. Burada sonunda “n” bulunan
komutlar birden fazla kayıt atlamaya yarıyor. Yani “isciler.MoveNextn 5” komutu
5 kayıt sonrasına atlamaya yarıyor. “MoveTo n” şeklinde de “n” sayısıyla verilen
kayda konumlanılabiliyor. ORADYN_NOCACHE parametresi OO4O’nun yüklendiği ana
dizindeki OraConst.txt dosyasında sayısal bir değere karşılık gelen bir sabit
olarak tanımlanmış. Bu parametrenin amacı istemci bilgisayarın sorgu sonucu
dönen kayıt setini saklamamasını sağlamaktır.
Yazdığımız sorgular içerisinde değişken kullanmak isteyebiliriz. Bunun için
kullanacağımız değişkenleri OraDynaSet nesnemize tanıtmalıyız.
<%EmpDb.Parameters.Add "isci_adi", "ihsan", ORAPARM_INPUT%>
Burada “isci_adi” adında bir değişken tanımlıyoruz ve bu değişkenin değerine
“ihsan” karakter dizisini aktarıyoruz. En sondaki ORAPARM_INPUT ise bu değişkenin
bir giriş değişkeni olduğunu bildiriyor. Aşağıdaki program parçası bu amaçla
adı ihsan olan tüm işçilerin adlarını ve numaralarını alt alta listeliyor.
<%Set OO4OSession = CreateObject(“OracleInProcServer.XOraSession")
Set isciDb = OO4OSession.OpenDatabase("ogr", "usr_esef/esef",
0 )
isciDb.Parameters.Add "isci_adi", "ihsan", ORAPARM_INPUT
Set isciler = isciDb.CreateDynaset("SELECT isciadi, iscino FROM isci WHERE
isciadi = :isci_adi",ORADYN_NOCACHE)
While NOT isciler.EOF
Response.Write isciler("isciadi")
Response.Write isciler("iscino")
Response.Write "<BR>"
isciler.MoveNext
Wend%>
OO4O’da SQL komutlarını çalıştırmak için iki metod kullanılıyor: ExecuteSQL
ve CreateSQL
<%Set OO4OSession = CreateObject("OracleInProcServer.XOraSession")
Set isciDb = OO4OSession.OpenDatabase("ogr", "usr_esef/esef",
0)
isciDb.Parameters.Add "isci_adi", "ihsan", ORAPARM_INPUT
isciDb.ExecuteSQL ("UPDATE isci SET ucret = ucret + 1000
WHERE isciadi = :isci_adi")%>
CreateSQL metodunun kullanım şekli:
Set sqlcumlesi = isciDb.CreateSQL("UPDATE isci SET ucret=ucret+1000
WHERE isciadi=:isci_adi")
Bu iki metod birbirinin yerine kullanılabildiği gibi aralarında bir fark vardır.
CreateSQL metodu çalıştırıldıktan sonra OraSQLStmt nesnesini oluşturur. Bu nesne
sayesinde aynı sorgu tekrar oluşturulmadan “Refresh” metodu ile çalıştırılabilir.
Çünkü yazdığımız sorgu zaten bellektedir. Örneğin yukarıdaki örneğe bağlı olarak
başka bir işçinin maaşını artırmak istersek parametre değişkenimizin değerini
değiştirip sorgumuzu tazelemek yeterli olur.
isciDb.Parameters("isciadi").Value = "kahraman"
sqlStatement.Refresh
Bir tabloya kayıt eklemek ve silmek içinde SQL komutları çalıştırmalıyız. Yukarıdakilerle
benzer şekilde bu işlemlerin yazım şekli şöyle gerçekleştirilebilir:
Set sqlcumlesi = isciDb.CreateSQL ("DELETE from isci
WHERE isciadi = :isci_adi")
isciDb.ExecuteSQL ("INSERT INTO isci(iscino,isciadi,isi,muduru,bolum)
VALUES (1233, 'kerim', 'yazıcı', 7839, 30) ")
PL/SQL bloklarını OO4O kullanarak çalıştırmak için yine CreateSQL ve ExecuteSQL
metotlarını kullanıyoruz. PL/SQL bloklarının kullanımını küçük bir örnek üzerinde
gösterelim. Bu örneği “bolum” tablosu üzerinde gerçekleştirelim. Bölüm numarasını
parametre olarak alıp, bu bölümün adını ve bulunduğu ili geri döndüren bir prosedür
yazalım ve OO4O nesneleri ile bunu çalıştıralım.
CREATE OR REPLACE PACKAGE pac_bolum as
PROCEDURE bolum_ad_al (bolum_no IN NUMBER, bolum_ad OUT VARCHAR2,
bolum_yer OUT VARCHAR2);
END pac_bolum;
CREATE OR REPLACE PACKAGE BODY pac_bolum as
PROCEDURE bolum_ad_al(bolum_no IN NUMBER, bolum_ad OUT VARCHAR2,
bolum_yer OUT VARCHAR2) is
BEGIN
SELECT bolumad, bolumyer into bolum_ad, bolum_yer from bolum
WHERE bolumno = bolum_no;
END;
END pac_bolum;
PL/SQL ile paketler oluşturma daha önce anlatılmıştı. Burada yukarıda oluşturduğumuz
paketi veritabanına kaydediyoruz. Asp sayfamızda yapacağımız iş bu paket içerisindeki
fonksiyonu çalıştırmak.
<%Set OO4OSession = CreateObject("OracleInProcServer.XOraSession")
Set isciDb = OO4OSession.OpenDatabase("ogr", "usr_esef/esef",
0)
isciDb.Parameters.Add "bolum_no", 10, ORAPARM_INPUT
isciDb.Parameters("bolum_no").ServerType = ORATYPE_NUMBER
isciDb.Parameters.Add "bolum_ad", 0, ORAPARM_OUTPUT
isciDb.Parameters("bolum_ad").ServerType = ORATYPE_VARCHAR2
isciDb.Parameters.Add "bolum_yer", 0, ORAPARM_OUTPUT
isciDb.Parameters("bolum_yer").ServerType = ORATYPE_VARCHAR2
Set PlSqlcumlesi = isciDb.CreateSQL("Begin pac_bolum.bolum_ad_al
(:bolum_no, :bolum_adi, :bolum_yer); end;", 0&)
Response.Write isciDb.Parameters("bolum_adi").Value &
isciDb.Parameters("bolum_yer").Value
%>
Yukarıdaki program parçasında önce veritabanı bağlantısı kuruluyor. Daha sonra
prosedüre gönderilecek ve prosedürden dönen değerleri karşılayacak değişkenler
tanımlanıyor. Burada parametre değişkenlerinin veri tiplerinin nasıl belirlendiği
de görülüyor. Bunun için “ServerType” kullanılıyor. “ORATYPE_NUMBER” ve “ORATYPE_VARCHAR2”
sabitleri yine OraConst.txt dosyasında tanımlanmış ve Oracle’da kullandığımız
“number” ve “varchar2” veri tiplerine karşılık geliyor. Daha sonra “CreateSQL”
metodu ile “begin ..end” bloğu içerisinde ilgili prosedürümüz “paket_adı . prosedür_adı(parametreler)”
şeklinde çağrılıyor. Sonrada değişkenlerimizde elde ettiğimiz değerler ekrana
yazdırılıyor. Burada “bolum_no” değişkenine bir ilk değer verildiği için aranan
bölüm numarasının direk 10 olduğu görülüyor.
OO4O’da veri işleme dili komutlarının kullanılabileceğini de söylemiştik.
Yani bir veri tabanı nesnesi oluşturup bununla ilgili hakları diğer kullanıcılara
vermek gibi işlemler yapılabilir. Aşağıdaki örneğimizde de “isci” tablomuzu
oluşturma ve bazı hakları kullanıcılara verme işlemleri görülmekte.
Set OO4OSession = CreateObject("OracleInProcServer.XOraSession")
Set isciDb = OO4OSession.OpenDatabase("ogr", "usr_esef/esef",
0)
isciDb.ExecuteSQL("create table isci (isciadi VARCHAR2(20),
iscino NUMBER(6),
muduru NUMBER(6),
ucret NUMBER(6)")
isciDb.ExecuteSQL("GRANT UPDATE,INSERT,DELETE ON isci TO usr_gef")
isciDb.ExecuteSQL("REVOKE UPDATE ON isci FROM usr_gef")