Sağlık ve Bilişimde Objektif Haber

  English

 SQL UYGULAMALARI – 4

            Merhaba. Bundan önceki sayılarda ORACLE VTYS üzerinde çalışan SQL komutlarını ve kullanım şekillerini inceledik. Bu sayımızda SQL komutlarının ve veritabanı yapılarının, ORACLE ile IBM DB2 VTYS üzerinde uygulanış biçimleri ve farklılıklarını göreceğiz. SQL ifadeleri, ORACLE 9.0.1 ile IBM DB2 8.1 Enterprise Edition üzerinde çalıştırılan Çözüm Hasta Takip Yazılımının F9 SQL İşlemleri formunda test edilmiştir.

             ORACLE VTYS için yazılan SQL örnekleri, IBM DB2 üzerinde çalışan herhangi bir Çözüm yazılımının F9 SQL işlemleri formunda, üzerinde bir değişiklik yapılmadan çalıştırılabilir. ORACLE SQL ifadelerinin IBM DB2 için uyarlanma işlemi, Çözüm Yazılımları içerisinde otomatik olarak yapılmaktadır.

 Veri Tipleri, ORACLE ve IBM DB2 karşılıkları :

ORACLE
NOT
IBM DB2
AÇIKLAMA
DATE
DATE Sadece gün, ay ve yıl bilgisi tutulacaksa DATE kullanılabilir.Sadece saat, dakika, saniye bilgisi tutulacaksa TIME kullanılabilir.Tarih ve saat bilgisi kullanılacaksa TIMESTAMP kullanılır.
TIME
TIMESTAMP
TIMESTAMP
VARCHAR2(n)
n < = 4000 VARCHAR(n) n < = 32672
LONG
n < = 2 GB VARCHAR(n) n < = 32672 byte ise VARCHAR kullanınız32672 < n < = 32700 byte ise LONG VARCHAR veya CLOB kullanınız. 32672 < n < = 2 GB ise CLOB kullanınız.
LONG VARCHAR(n)
CLOB(n)
RAW(n)
n < = 255 CHAR(n) FOR BIT DATA n < = 254 ise CHAR(n) FOR BIT DATA kullanınız.n < = 32672 ise VARCHAR(n) FOR BIT DATA kullanınız.n < = 2 GB ise BLOB(n) kullanınız.
VARCHAR(n) FOR BIT DATA
BLOB(n)
LONG
n < = 2 GB VARCHAR(n) FOR BIT DATA n < = 32672 byte ise VARCHAR(n) FOR BIT DATA kullanınız. 32672<n<= 32700 byte ise LONG VARCHAR FOR BIT DATA kullanınız. n < = 2 GB ise BLOB(n) kullanınız.
LONG VARCHAR FOR BIT DATA
RAW(n)
BLOB(n)
BLOB
n < = 4 GB BLOB(n) n < = 2 GB ise BLOB(n) kullanınız.
CLOB
n < = 4 GB CLOB(n) n < = 2 GB ise CLOB(n) kullanınız.
NCLOB
n < = 4 GB DBCLOB(n) n < = 2 GB ise DBBLOB(n/2) kullanınız.
NUMBER
SMALLINT Oracle' da NUMBER(p) veya NUMBER(p,0) tanımı yapılmış ise 1 < = p < = 4 ise SMALLINT, 5 < = p < = 9 ise INTEGER, 10 < = p < = 18 ise BIGINT kullanınız. Oracle' da NUMBER(p,s) tanımı yapılmış ve s > 0 ise DECIMAL(p,s) kullanınız. Oracle' da NUMBER tanımı yapılmış ise DOUBLE/FLOAT(n) REAL kullanınız.
INTEGER
BIGINT
DECIMAL(p,s)
DOUBLE/FLOAT(n)/REAL

 

 DUAL

 ORACLE' da kullanılan DUAL ifadesinin yerine IBM DB2 da SYSIBM.SYSDUMMY1 ifadesi kullanılır.

 SELECT 10 AS SAYI FROM DUAL

Yukarıda kullanılan SQL ifadelerinin IBM DB2 da ki karşılıkları aşağıda verilmiştir.

 SELECT 10 AS SAYI FROM SYSIBM.SYSDUMMY1

SAYI
10

 SELECT 'PAZARTESİ' AS GUN FROM SYSIBM.SYSDUMMY1

GÜN
PAZARTESİ

 SYSDATE

 ORACLE' da kullanılan SYSDATE ifadesinin yerine IBM DB2 da CURRENT TIMESTAMP ifadesi kullanılır. SYSDATE, ORACLE VTYS nin yüklü bulunduğu bilgisayarın tarih ve saatini döndürür. Aynı şekilde CURRENT TIMESTAMP ifadesi, IBM DB2 VTYS nin yüklü bulunduğu bilgisayarın tarih ve saatini döndürür.

 SELECT SYSDATE AS ZAMAN FROM DUAL         

 SELECT CURRENT TIMESTAMP AS ZAMAN FROM SYSIBM.SYSDUMMY1 

ZAMAN
04.02.2003 08:48:15

USER_TABLES

 Kullanıcı tarafından oluşturulan tüm tabloların isim ve diğer bilgilerinin tutulduğu bu tablonun, IBM DB2 daki karşılığı SYSCAT.TABLES dır. CREATE TABLE komutu ile veritabanına yeni bir tablo eklendiğinde veya bir tablo DROP komutu ile kaldırıldığında, ORACLE daki USER_TABLES veya IBM DB2 daki SYSCAT.TABLES tabloları otomatik olarak güncellenir.

 SELECT * FROM USER_TABLES

SQL ifadesi çalıştırıldığında, görüntülenen alanların bazıları aşağıdaki tabloda gösterilmiştir.

TABLE_NAME
TABLESPACE_NAME
PCT_FREE
PCT_USED
LOGGING
TABLE_LOCK
MONITORING
ACARI
USERS
10
40
YES
ENABLED
NO
ACARIFIS
USERS
10
40
YES
ENABLED
NO

 SELECT * FROM SYSCAT.TABLES

 SQL ifadesi IBM DB2 da çalıştırıldığında, görüntülenen alanların bazıları aşağıdaki tabloda gösterilmiştir.

TABNAME
TBSPACE
CREATE_TIME
TABLEID
COLCOUNT
TYPE
STATUS
ACARI
USERSPACE1
04.02.2003
6
86
T
N
ACARIFIS
USERSPACE1
04.03.2003
7
9
T
N

 USER_VIEWS

 Kullanıcı tarafından oluşturulan tüm VIEW ların isim ve diğer bilgilerinin tutulduğu bu tablonun, IBM DB2 daki karşılığı SYSCAT.VIEWS dır. CREATE OR REPLACE komutu ile veritabanına yeni bir VIEW eklendiğinde veya bir VIEW DROP komutu ile kaldırıldığında, ORACLE daki USER_VIEWS veya IBM DB2 daki SYSCAT.VIEWS tabloları otomatik olarak güncellenir.

 SELECT * FROM USER_VIEWS

 SQL ifadesi çalıştırıldığında, görüntülenen alanların bazıları aşağıdaki tabloda gösterilmiştir.

VIEW_NAME
TEXT_LENGTH
TEXT
VIEW_TYPE
SUPERVIEW_NAME
ODFIS40
475
(MEMO)
SYATIS76
213
(MEMO)

SELECT * FROM SYSCAT. VIEWS

 SQL ifadesi IBM DB2 da çalıştırıldığında, görüntülenen alanların bazıları aşağıdaki tabloda gösterilmiştir.

VIEW_NAME
VALID
TEXT
READONLY
DEFINER
ODFIS40
Y
(MEMO)
Y
DB2ADMIN
SYATIS76
Y
(MEMO)
Y
DB2ADMIN

 TRIGGERS (Tetikleyiciler)

             Bir tabloya uygulanan INSERT, UPDATE ve DELETE komutlarından önce ve/veya sonra (veritabanın desteklemesine bağlı olarak) yapılması istenen işlemlerin veritabanı içerisinde yapılmasını sağlayan SQL komutlarını kapsayan yapıdır. FATURA tablosuna bir satır eklendiğinde, CARI tablosunda bulunan tutarların veritabanı tarafından otomatik olarak güncellenmesi veya FATURA tablosu silinmeden önce, FATURASATIR larının silinmesi TRIGGER ile sağlanabilir.

             ORACLE ile IBM DB2 TRIGGER özellikleri büyük benzerlikler gösterirler. Bununla birlikte ORACLE ın üstün özellikleri vardır. ORACLE da bir TRIGGER birden fazla görevi üstlenirken, IBM DB2 da tek görevi üstlenir. Örneğin ORACLE da UPDATE, INSERT ve DELETE işlemi için tek TRIGGER tanımlanabilirken, IBM DB2 da her birisi için ayrı ayrı TRIGGER tanımlamak gerekir. Bu ise, benzer kaynak kodların tekrarlanmasına ve bir yerine birden fazla TRIGGER ın sistem içinde kontrol edilmesi zorunluluğuna sebep olur.

 ORACLE da ALTER TRIGGER komutu ile TRIGGER lar ENABLE (çalışabilir) ve DISABLE (çalışamaz) yapılabilirken, IBM DB2 da TRIGGER ların DISABLE yapılabilmesi için DROP edilmesi gerekir.

             INSTEAD OF TRIGGER lar IBM DB2 da desteklenmemektedir.

             IBM DB2 da BEFORE TRIGGER lar desteklenmemektedir. Sadece AFTER TRIGGER lar desteklenmektedir. ORACLE da her iki TRIGGER uygulaması da desteklenmektedir.   

Tekil numara üretimi için kullanılan SEQUENCE (Sıra) lar :

             ORACLE ve IBM DB2 VTYS de, tüm veritabanı içinde tekil numaraların üretilmesi ve kullanılması için SEQUENCE (Sıra) lar mevcuttur. Sıraların oluşturulması, değiştirilmesi ve silinmesi standart SQL komutları ile yapılır. Bir sıra üzerinde herhangi bir değişiklik yapılmadığı sürece, önceden üretilen bir sayı tekrar üretilmez. Bu sayede çiftleme olayı engellenmiş olur. Örneğin her hasta için tekil bir dosya numarası üretme işlemi sıralar kullanılarak gerçekleştirilir.

             Kullanıcılar ve sistem tarafından oluşturulan tüm sıraların listesinin bulunduğu tablo ismi ORACLE da USER_SEQUENCES iken, IBM DB2 da SYSCAT.SEQUENCES dir.

             SELECT * FROM USER_SEQUENCES

 SQL ifadesi çalıştırıldığında, görüntülenen alanların bazıları aşağıdaki tabloda gösterilmiştir.

SEQUENCE_NAME
MIN_VALUE
MAX_VALUE
INCREMENTBY
LAST_NUMBER
ACARISEQ
1
1E27
1
203
ACEKSEQ
1
1E27
1
415

 SELECT * FROM SYSCAT.SEQUENCES

 SQL ifadesi IBM DB2 da çalıştırıldığında, görüntülenen alanların bazıları aşağıdaki tabloda gösterilmiştir.

SEQNAME
MINVALUE
MAXVALUE
INCREMENT
SEQID
ACARISEQ
1
2.147.483.647
1
7
ACEKSEQ
1
2.147.483.647
1
8

1 - CREATE SEQUENCE DENEME1 START WITH 500 INCREMENT BY 1 NOCACHE NOCYCLE

2 - SELECT DENEME1.NEXTVAL FROM DUAL

3  DROP SEQUENCE DENEME1

1 - CREATE SEQUENCE DENEME1 START WITH 500 INCREMENT BY 1 NO CACHE NO CYCLE

2  SELECT NEXTVAL FOR DENEME1 FROM SYSIBM.SYSDUMMY1

3        DROP SEQUENCE DENEME1

             Bir önceki sayfada sıralanmış olan SQL ifadelerinden ilki, DENEME1 isimli sırayı, üreteceği değer 500 den başlayacak ve her defasında 1 artıracak şekilde oluşturur. İkinci SQL ifadesi, DENEME1 sırasının değerini döndürür ve bir artırır. Üçüncü SQL ifadesi, DENEME1 sırasını DROP eder.

            Sıraların daha iyi anlaşılması için aşağıdaki uygulamayı yapalım. KAYIT isimli bir tablo oluşturalım. Bu tabloda KAYITNO alanı otomatik artsın. Tablodaki diğer alanlar, kaydı yapılan kişinin ADI ve SOYADI olsun.

            CREATE TABLE KAYIT (KAYITNO NUMBER, ADI VARCHAR2(30), SOYADI VARCHAR2(30))

 SQL ifadesi ile KAYIT tablosu ORACLE VTYS de oluşturulur. KAYITNO alanı için bir KAYITNOSEQ sırasını oluşturalım.

            CREATE SEQUENCE KAYITNOSEQ START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE

            KAYIT tablosuna, KAYITNOSEQ sırasını da kullanarak aşağıdaki şekilde kayıtlar ekleyebiliriz.

            INSERT INTO KAYIT (KAYITNO, ADI,  SOYADI) VALUES (KAYITNOSEQ.NEXTVAL, 'AHMET', 'ÇETİN')

            INSERT INTO KAYIT (KAYITNO, ADI,  SOYADI) VALUES (KAYITNOSEQ.NEXTVAL, 'CANAN', 'ŞAHİN')

            SELECT * FROM KAYIT

            SQL ifadesi çalıştırıldığında sonucu görülür.

KAYITNO
ADI
SOYADI
1
AHMET
ÇETİN
2
CANAN
ŞAHİN

           Veritabanında, aynı sıra birden fazla kullanıcı tarafından kullanılsa bile, aynı değer sadece bir kullanıcıya verilir, sıra belirtilen miktarda artırılır ve diğer kullanıcıya yeni değer verilir. Bu sayede çiftleme hiçbir zaman olmaz.

            Yukarıdaki SQL ifadelerinin IBM DB2 daki karşılıkları aşağıda sırasıyla verilmiştir.

            CREATE TABLE KAYIT (KAYITNO DOUBLE, ADI VARCHAR2(30), SOYADI VARCHAR2(30))

            CREATE SEQUENCE KAYITNOSEQ START WITH 1 INCREMENT BY 1 NO CACHE NO CYCLE

            INSERT INTO KAYIT (KAYITNO, ADI,  SOYADI) VALUES (NEXTVAL FOR KAYITNOSEQ, 'AHMET', 'ÇETİN')

            INSERT INTO KAYIT (KAYITNO, ADI,  SOYADI) VALUES (NEXTVAL FOR KAYITNOSEQ, 'CANAN', 'ŞAHİN')

            SELECT * FROM KAYIT

            CREATE OR REPLACE VIEW

            ORACLE da bir VIEW ın SQL ifadesini değiştirerek, tekrar oluşturulması için CREATE OR REPLACE VIEW VIEWNAME ifadesi yeterliyken, IBM DB2 da öncelikle VIEW n DROP edilmesi ve sonrasında CREATE VIEW VIEWNAME komutu ile tekrar oluşturulması gerekmektedir.

 CREATE OR REPLACE VIEW HASTASEC AS

            SELECT HS_KEY AS DOSYANO, (HS_AD||' '||HS_SOYAD) AS ADSOYAD FROM HASTA WHERE HS_KEY < 10

            SQL ifadesini kullanarak HASTASEC VIEW ini oluşturalım. ORACLE da, WHERE satırında değişiklik yaparak, aynı isimli VIEW ı tekrar oluşturmak için

            CREATE OR REPLACE VIEW HASTASEC AS  SELECT HS_KEY AS DOSYANO, (HS_AD||' '||HS_SOYAD) AS ADSOYAD FROM HASTA  WHERE HS_KEY < 5

 Yazmak yeterli iken, IBM DB2 da, öncelikle

             DROP VIEW HASTASEC

             SQL ifadesi çalıştırılmalıdır. VIEW I oluşturmak için, daha sonra da aşağıdaki SQL ifadesi çalıştırılmalıdır.

             CREATE VIEW HASTASEC AS  SELECT HS_KEY AS DOSYANO, (HS_AD||' '||HS_SOYAD) AS ADSOYAD FROM HASTA   WHERE HS_KEY < 5

 Her iki VIEW üzerinde aşağıdaki SQL ifadesi çalıştırılabilir.

             SELECT * FROM HASTASEC

DOSYANO
ADSOYAD
1
Hakan Kerim ERDOĞAN
2
Cennet KILIÇ
3
Sevim TOSUN
4
Kadir TEKBAŞ

ROWNUM

 SELECT ifadesi ile geri döndürülen satırlarda, satır numarasını görüntülemek veya geri döndürülen satırların sınırlandırılması amacıyla kullanılır.

 SELECT ROWNUM, HS_KEY, HS_AD,  HS_SOYAD FROM HASTA WHERE ROWNUM < 4

 SELECT ROW_NUMBER () OVER(), HS_KEY, HS_AD,  HS_SOYAD FROM HASTA FETCH FIRST 3 ROWS ONLY

ROWNUM
HS_KEY
HS_AD
HS_SOYAD
1
1
HAKAN KERİM
ERDOĞAN
2
2
CENNET
KILIÇ
3
3
SEVİM
TOSUN