Orhan AKDOĞAN > PL/SQL

Oracle – Session Sayısı

select count(*) "Toplam session", 
(select count(*) from gv$session where type != 'BACKGROUND' ) "Toplam Session (Oracle Hariç)", 
(select count(*) from gv$session where status = 'ACTIVE' and inst_id=1 and type != 'BACKGROUND' ) "Aktif Session"
 from gv$session group by 1,2,3

Oracle – Session Monitor SQL

SELECT 
s.SCHEMANAME,
s.USERNAME,
UPPER(s.PROGRAM) PROGRAM,
 s.MACHINE,
 s.OSUSER,
s.MODULE
FROM V$SESSION S, V$PROCESS p,
      (SELECT DISTINCT SID, SERIAL#, AUTHENTICATION_TYPE, CLIENT_CHARSET, CLIENT_VERSION FROM V$SESSION_CONNECT_INFO) SCI
 WHERE  ( (s.USERNAME is not null) and (NVL(s.osuser,'x') <> 'SYSTEM') and (s.type <> 'BACKGROUND') )
and  p.addr(+) = s.paddr
and  sci.sid = s.sid and sci.serial# = s.serial#
order by "PROGRAM", OWNERID

Oracle – Tekrar eden kayıtları silmek

Silinecek Tekrarları Listelemek için;

SELECT * FROM tabloadi x
WHERE x.rowid > ( SELECT MIN(y.rowid) FROM tabloadi y WHERE x.tekrarfield= y.tekrarfield)

Tekrarları Silmek için;

DELETE FROM  tabloadi x
WHERE x.rowid > ( SELECT MIN(y.rowid)  FROM tabloadi y  WHERE x.tekrarfield = y.tekrarfield );

Oracle – Tablo Veri Boyutları (MB)

SELECT
owner AS "OWNER",
segment_name AS "OBJECT",
partition_name AS "PARTITION",
tablespace_name AS "TABLESPACE",
segment_type AS "TYPE",
ROUND (bytes / 1024 / 1024, 2)  AS "Boyut(MB)"
FROM dba_segments
WHERE segment_type IN ('TABLE', 'TABLE PARTITION')
AND owner = 'ABALI2011'
Order by ROUND (bytes / 1024 / 1024, 2) desc

Oracle – LISTAGG Analystic Function

LISTAGG fonksiyonu, 11gR2 ile gelen yeni bir fonksiyondur.

Kullanımı: LISTAGG(kolonadi,ayraç)

Anlatımımızı örnekle yapalım;
Şu şekilde bir tablomuz olduğunu varsayalım;

Depertman        Personel
Muhasebe           Fikret
Muhasebe           Ceyda
Satınalma            Turan
Satınalma            Emel

Her depertman satırının karşısında kişileri listelemek isteyelim,

Depertman          Personel
Muhasebe            Fikret,Ceyda
Satınalma             Turan,Emel

bu tip bir listelemeyi LISTAGG fonksiyonu kullanarak yapabiliriz.

Select Depertman, LISTAGG(Personel,',') as "Personeller" from tblSicil Group by Depertman

Daha önce kullandığımız ve aynı işi yapan WM_CONCAT ile arasındaki farklar ise şunlardır.

1-WM_CONCAT Oracle tarafından dökümante edilmemiştir, yani desteklenmez.LISTAGG ise Oracle tarafından desteklenen bir fonksiyondur.

2-WM_CONCAT, distinct kullanımına izin verir, LISTAGG ile kullanamazsınız.

select wm_concat(distinct sehir) as sehirler from Ulkeler;

3-LISTAGG ayrılmış dizelerin kendi içinde order ına izin verir, WM_CONCAT de yapılamaz.

select listagg(sehir,',') within group(order by sehirID desc) as sehirler from Ulkeler;

4-LISTAGG ayraç olarak birden fazla karakter kullanımına izin verir, WM_CONCAT buna izin vermez.

select listagg(sehir,'***') within group(order by sehirID desc) as sehirler from Ulkeler;

5-WM_CONCAT keep kullanımına izin verir, LISTAGG izin vermez.

select wm_concat(sehir) keep(dense_rank first order by sehirID ) as sehirler from Ulkeler;

6-WM_CONCAT olap da order by kullanımına izin verir, LISTAGG izin vermez.LISTAGG order by haricinde OLAP da desteklenir.

select deptno,wm_concat(sehir) over(order by sehirID ) as enames from Ulkeler;

Oracle – NVL, NVL2, NULLIF, COALESCE

NVL (expr1, expr2)

NULL bir değeri  gerçek bir değere dönüştürmek için kullanırız. Çevrim değil yerine geçme söz konusudur.

SELECT AD,SOYAD,NVL(BAKIYE,0)  
FROM VWOGRENCI

Hiç hareket görmemiş yani alacak ve borç kaydı yapılmamış bir öğrencinin bakiyesi null dönecektir, bu sorgu ile null değerlerin 0 olarak dönmesini sağlıyoruz.

Yeni başlayanlar tarafından en çok yapılan yanlışlardan biride, NULL ile boş ya da sıfır değeri eşdeğer görmektir.

NULL; alana herhangi bir değer atanmadığını ifade eder.Boş (“”) veya Sıfır (0) atamaları ise karakter ve nümerik değerlerdir.

SELECT STOK_KODU "Stok Kodu"  ,MAX_ISKONTO "Maximum İskonto"
FROM TBLSTSABIT
WHERE MAX_ISKONTO = NULL

Bu kullanım hatalıdır çünkü NULL bir değer yoktur bu yüzden atama kontrolü de olamaz.

Eğer Maximum İskonto değeri belirlenmemiş kayıtları listelemek amaç ise, doğrusu şu şekilde olmalıdır:

SELECT STOK_KODU "Stok Kodu"  ,MAX_ISKONTO "Maximum İskonto"
FROM TBLSTSABIT
WHERE MAX_ISKONTO IS NULL

NVL2 (expr1, expr2, expr3)

Fonksiyonda expr1 NULL değilse expr2, expr1 NULL ise  expr3 ‘ü değer olarak döndürür.

SELECT  NVL2(ikinciad  , ad+' '+ikinciad+' '+soyad  ,  ad+' '+soyad) "AD SOYAD"
FROM VWOGRENCI

NULLIF (expr1, expr2)
Bu fonksiyon ile iki değer karşılaştırılır, eğer expr1 ile expr2 eşitse NULL, eşit değiller ise expr1 sonuç olarak dönülür.

expr1 ve expr2 sayısal değerler ya da aynı veritipinin değerleri olmalıdır.

NULLIF deyimi Oracle 9i, Oracle 10g, Oracle 11g versiyonlarında desteklenmektedir.

NULLIF(12, 12)     -- "NULL"
NULLIF(12, 13)     -- "12"
NULLIF('orhan', 'orhan')    --"NULL"
NULLIF('orhan', 'ibrahim')  --"orhan"
NULLIF(NULL, 12)   -- "ORA-00932 error because expr1 can not be the literal NULL" hatası.

COALESCE (expr1, expr2, . . , exprn)

Coalesce fonksiyonu aldığı argümanlardan null olmayan ilk ifadeyi görüntüler.

SELECT coalesce (ceptel, istel, evtel,'Girilmemiş') "Telefon"
FROM Ogrenci;

Bu Sorgu girilmiş olan ilk telefon bilgisini sonuç olarak döndürür;
bu işlemi alternatif bir yolla yapmak isteseydik;

IF ceptel is not null THEN
     result := ceptel;
ELSIF istel is not null THEN
    result := istel;
ELSIF evtel is not null THEN
    result := evtel;
ELSIF 'Girilmemiş' is not null THEN
    result := 'Girilmemiş';
ELSE
    result := null;
END IF;

şeklinde kullanmamız gerekirdi.

Coalesce deyimi Oracle 9i, Oracle 10g, Oracle 11g versiyonlarında desteklenmektedir.

Microsoft SQL Server’da;
NVL karşılığı ISNULL,
NULLIF ve COALESCE (‘koliş’) ise aynen kulanılır.
NVL2‘nin ise karşılığı yok.