Koray Kırdinli

Yazılım ve İş Yaşamı Hakkında Paylaşımlar

Bir tablo adı geçen Stored Procedure’lerin listesini almak.

Bir tablo adının geçtiği stored prosedürleri bulmak için aşağıdaki select ten faydalanabilirsiz.  Tabi sadece tablo adı değil herhangi bir kelime de aratabilirsiniz.  Bundan sonraki arama işlemleri artık yaratıcılığınıza kalmış.
SELECT DISTINCT *
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
INNER JOIN sys.procedures AS p ON p.[object_id]=sc.id
INNER JOIN sys.schemas s ON s.[schema_id] = p.[schema_id]
WHERE sc.TEXT LIKE ‘%TABLE_NAME%’ AND s.name = ‘SCHEMA_NAME’
Reklamlar

Eylül 23, 2014 Posted by | MSSql | , | Yorum bırakın

SQL Tabloda Duplike Kayıtları Silmek (lockres)

Aşağıdaki sql örneği ile duplike kayıtları silmek mümkün. lockres pseudo kodu o rowun fiziksel adresini gösteriyor.

CREATE TABLE TabloAdi (
Column1 varchar(1),
Column2 int
)

INSERT INTO TabloAdi VALUES (‘A’, 1);
INSERT INTO TabloAdi VALUES (‘A’, 1); — duplicate
INSERT INTO TabloAdi VALUES (‘A’, 2);
INSERT INTO TabloAdi VALUES (‘B’, 1);
INSERT INTO TabloAdi VALUES (‘B’, 2);
INSERT INTO TabloAdi VALUES (‘B’, 2); — duplicate
INSERT INTO TabloAdi VALUES (‘B’, 2); — duplicate
INSERT INTO TabloAdi VALUES (‘B’, 2); — duplicate
INSERT INTO TabloAdi VALUES (‘C’, 2)
SELECT *,%%lockres%%
FROM TestTable a
ORDER BY a.Column1, a.Column2

DELETE
FROM TabloAdi
WHERE TabloAdi.%%lockres%%
NOT IN (SELECT MIN(b.%%lockres%%)
FROM TabloAdi b
GROUP BY b.column1, b.Column2)

SELECT Column1,Column2,%%lockres%%
FROM TabloAdi a
ORDER BY a.Column1, a.Column2

Herkese iyi günler dilerim…

Aralık 21, 2012 Posted by | MSSql | , , | 1 Yorum

The server principal “sqlLoginName” is not able to access the database “myDatabaseName” under the current security context.

Şirkette geçenlerde DRC(Disastery Recovery Center)  serverlarımızda bir test yapmak için bir veritabanı uygulaması publish ettik ve loglarında bu hata ile karşılaştık. Biraz araştırunca sql server’ın restore olması sırasında syslogin SID si ile sysuser SID sinin uyuşmuyor olabileceğini gördük.
Aşağıdaki sorgularla SID leri karşılaştırdık.

USE <myDatabaseName>
SELECT sid FROM sys.sysusers WHERE name = ‘userName’
SELECT sid FROM sys.syslogins WHERE name = ‘userName’

ve aşağıdaki stored prosedür ile de problemi çözdük.
EXEC sp_change_users_login @Action=’update_one’, @UserNamePattern=’userName’,@LoginName=’userName’


You can see that the SID does not match the system views: sys.sysusers and sys.syslogins

SELECT sid FROM sys.sysusers WHERE name = ‘sqlLoginName’
SELECT sid FROM sys.syslogins WHERE name = ‘sqlLoginName’

http://blogs.technet.com/b/mdegre/archive/2010/08/28/the-server-principal-quot-sqlloginname-quot-is-not-able-to-access-the-database-quot-mydatabasename-quot-under-the-current-security-context.aspx

 

Aralık 5, 2012 Posted by | MSSql | , , , , | Yorum bırakın

T-SQL’de duplike kayıtları silmek (With kullanımı)

CREATE TABLE tablo (Col1 INT, Col2 INT)
GO

INSERT INTO tablo VALUES(1,1),(1,1), –duplicate
(1,1), –duplicate
(1,2),
(1,2), –duplicate
(1,3),
(1,4)
GO

SELECT * FROM tablo
GO

WITH CTE (COl1,Col2, DuplicateCount)
AS
(
SELECT COl1,Col2,
ROW_NUMBER() OVER(PARTITION BY COl1,Col2 ORDER BY Col1) AS DuplicateCount
FROM tablo
)
DELETE
FROM CTE
WHERE DuplicateCount > 1
GO

SELECT * FROM tablo
GO

DROP TABLE tablo

Buradaki CTE ,  Common Table Expression demektir ve bize rekülsive sorguları basitleştirmek için bir yöntem sunar.
WITH CTE name ( columns)
AS ( CTE definition )
SELECT|INERT|UPDATE|DELETE… FROM… CTE name
DEtaylı bilgiyi aşağıdaki linklerden edinebilirsiniz.
http://www.csharpnedir.com/articles/read/?id=477&title=SQL%20Server%202005%20:%20Recursive%28%C3%96z-yinelemeli%29%20Sorgular%20ve%20CTE

http://msdn.microsoft.com/en-us/library/ms175972.aspx

Şubat 22, 2012 Posted by | MSSql | , , , | Yorum bırakın

Windows does not recognize this MIME type Hatası

Oracle 10g Express Edition’ı kurmak için ORacle’ın sitesine girmiştim.

Aşağıdaki linkten indirme işlemini yapabilirsiniz.

http://www.oracle.com/technetwork/database/express-edition/downloads/index.html

Daha sonra indirdiğimde Windows7 olan işletim sisteminde bu kurulum dosyasını çalıştıramadım ve “Windows does not recognize this MIME type” atasını aldım.

Bunu engellemek için küçük bir hile yaptım ve dosyanın adını değitirerek OracleXE2.exe uzuntılı yaptım ve artık çift tıklayarak kurulumu yapabilecek hale geldim.

Böyle bir problem ile karşılaşan arkadaşlar kolaylıkla bunun üstesinden gelebilirler.

Mart 30, 2011 Posted by | Oracle | , , , , | Yorum bırakın

C# ile Oracle’a Bağlanma Sorunum

Kurum içerisinden oracle’a bağlanma ihtiyacım olmuştu.Evdeki bilgisayarımda hiç bir ekstra ayar yapmadan kolayca başlanabilmiştim ancak şirkette baya uğraştırdı beni doğrusu ama sonunda oldu. Oracle’a bağlanabilmek için hemen System.OracleClient namespace’ini kullanayım dedim ancak versiyon farkından dolayı bana
System.Data.OracleClient requires Oracle client software version 8.1.7 or greater.
hatasını verdi. Hemen bir araştırma yapıp OracleClient 10.2 yi buldum
OracleClient’ı kurunca NetManager ve Net Configuration Asistant yardımıyla D:oracleproduct10.2.0client_1NETWORKADMIN dizini altına tnsnames.ora ve sqlnet.ora ve listener.ora dosyalarını doğru şekilde oluşturdum.
Toad ile bu tnsname ‘i kullanarak bağlanabiliyordum ancak C#’tan ve sqlplus’ı kullanarak hala erişememiştim. ora-12154 tns could not resolve the connect identifier specified hatası alıyordum.
Bunu aşmak içinde Control Panelin altına ODBC Data Source Administrator’a providerımı Add diyerek ekledim.

Daha sonra da connection stringimi tnsname ile aynı yaptım aşağıdaki gibi ve mutlu son

Mayıs 14, 2010 Posted by | C#, Oracle | , , | Yorum bırakın

Oracle Sql Tuning’e Bir Çırpıda Bakış

Bu makalemizde Oracle ile ilgili bazı temel bilgilere ve özellikle de performans konusunu inceleyeceğiz. Oracle ile performans konusuna girmeden önce konuyla ilgili Oracle veri blokları ve bellek yapısını az da olsa anlamakta fayda var diye düşünüyorum. Temel kavramları anladıktan sonra üzerine inşa etmek daha kolay olacaktır.

Veri Blokları
Data Block :
Mantıksal olarak veri tutan en küçük veri birimidir. Küçükten büyüğe doğru
Extent ,Segment ,Tablespace ,Database olarak devam eder.
Fiziksel olarak ise OS blokları ve data file lerdan oluşur.
Tablespace : Bir dosya sistemindeki klasör gibi nitelendirebiliriz. Mantıksal olarak datafile bazında verileri fiziksel olarak gruplar. Schema ise tablespace’den farklı olarak mantıksaldır ve kullanım hakları ile ilgili bir gruplama yapar. Yani bir schema bir kullanıcının kullanmaya yetkili olduğu objeleri tutar. Bir kullanıcı bir tablespace’deki bütün objeleri kullanamayabilir.

*** : Performans faktörlerinden bir tanesini sistemin nasıl bir sistem olduğu etkiler. İki türlü sistem vardır. Bunlar OLAP(Online Analytic Processing).  yani raporlama sistemi büyük select sorguları çalıştırılır , diğeri ise OLTP (Online Transaction Processing) bu sistemde de küçük sorgular ancak çok kullanıcılı ve yoğun bir sorgu trafiği vardır.
Sistem türüne göre block size’lar belirlenmeli ve gerekli optimizasyonlar yapılmalıdır.
Örneğin çok büyük miktarda veri raporlanıyorsa data bloklar büyük set edilmeli çünkü bir seferde (1 fiziksel okumada)getirilecek veri miktarı daha fazla olur.

Bellek Yönetimi
Oracle yapı itibari ile SGA(System Global Area) ve PGA(Program Global Area) olmak üzere 2 tür bellek yapısı vardır.Bu yapıda SGA bütün veritabanı kullanları için ortak iken PGA ise connection bazlı olarak açılır. bu memory alanları Oracle’da performansı direk olarak  etkiler.Belleklerin iyi paylaştırılması ciddi anlamda performans kazandırır.Zaten tunning yaparken en çok karşımıza sorun olarak IO çıkacak yani performamızı belirleyen en önemli kriterlerden bir tanesi fiziksel okuma. Ne kadar az diske gidersek o kadar hızlanacağımızı aklımızın bir köşesinde tutalım.

*** : Ne kadar az fiziksel diske gidersek o kadar yüksek performans sağlarız. Bellekten çalışmak diskten çalışmaya göre daha hızlıdır.

Yukardaki şekilde de görülen yapıları bizim için önemli olanları kısaca tanımlayalım.
Library Cache : Her sql sorgusu çalıştırıldığında sorgu parse edilir ve bir tane execution plan denilen bir plan oluşturur. Bu plan hangi tabloda hangi indexler ile nereye bağlantı yapıldı , costu ne gibi bir takım özellikleri barındırır. İşte bir sorgu bir kez çalıştırıldığında oluşan execution plan bu bellek alanına yazılır. Eğer aynı sorgu bir kez daha çalıştırılırsa eğer Library Cache’te varsa tekrardan sorguyu parse etmez ve aynı planı kullanarak performans kazanır.
Data Dictionary Cache : Sql cümlesi bir tabloya erişmeye çalıştığında (SELECT * FROM tablo1) bu tabloya select atma hakkı var mı , bu tablonun istatistikleri neler gibi bir takım bilgilerin tutulduğu bellek alanıdır.
Buffer Cache : Bir tabloya bellek alanı boşken ilk sefer select sorgusu çalıştırılırsa direk olarak fiziksel diskten okur.Ancak bir kez çalıştıktan sonra bu bellek alanından okuyarak sonucu daha hızlı getirir.
Large Pool : Paralel ve Shared Server gibi işlerde kullanılabilir. Opsiyoneldir.
Log Buffer : Burada transaction bilgileri var. Veritabanı herhangi bir sebepten dolayı kapanırsa buradan son yapılan çalışmaları elde edebiliriz.

Redo Buffer,Java Pool ve Stream Pool

PGA ise kullanıcı bazlıdır. Oracle’a açılan her bir User process için server tarafında bir server process tahsis edilir. Yani her bir kullanıcı için serverda bellekten yer ayrılır.
*** : Gereksiz connectionların hafızadan temizlenmesi performansı artırır.

*** : Oracle 8i de bellek yönetimi tamamen admine bırakılmıştı.Her bir cache e teker teker boyutlarını vermek gerekiyordu.Library Cache’e ayrı Data Dictionary Cache’e ayrı. 10g ile birlikte sadece PGA ve SGA ya bellek alanları vermek durumundaydık , alt cache’lere teker teker verme zahmetinden kurtulmuş olduk. 11g ile birlikte bu yönetimi Oracle tamamen kendisi yapabilmektedir.

Performansınızı Uçurun

1- Tablo istatistiklerinin yanlış olması : Oracle execution plan oluştururken istatistiklere bakar. İstatistiklerde bir tabloda kaç kayıt var vs gibi bilgiler mevcuttur. Eğer sık insert alan bir tablo ise istatistikler sorgu çalışacağı anda yanlış olabilir.

Bunu bir örnekle modelleyelim. Stok adında bir tablomuz olsun başlangıçta 10 kaydımız var diyelim daha sonra toplu birşekilde tabloya import yaptık ve 9000000 kaydımız oldu diyelm. Oracle normal şartlarda sadece belli zamanlarda tabloların istatistiklerini tekrardan düzenler bu yüzden import işlemini yaptıktan sonra istatistiklerde kayıt sayısı hala 10 görülecektir.

SELECT * FROM Stok WHERE Kategori=’Bilgisayar’ sorgusunu çalıştırdık diyelim.

Stok tablomuzda Katagori kolonunda indeksimiz olmasına rağmen kayıt sayısı az olduğunu sanan Oracle bu indeksi kullanmayıp  Full Table arama yapabilir. Bu da sistemi bir hayli yorar. Halbuki istatistikler tam olsa index range scan yaparak çok daha az maliyet ile kayıtları getirebilir.

2- Sorgularda eşitliğin sol tarafında fonksiyon kullanmak index kullanımına engel olur. Örnek
     SELECT * FROM Stok WHERE UPPER(StokAdi)=’KLAVYE’
Bu sorguda StokAdi kolonunda indeks olsa dahi indeks kullanılmaz ve FULL TABLE çalışır.

3-Sub queryleri FROM’a yazmak en hızlısıdır.
Kötü Örnek:
Select Count(*) FROM Stok S WHERE S.Fiyat < 2*(SELECT AVG(Fiyat) FROM StokHareket          SH WHERE S.StokKod=SH.StokKod)

Düzeltilmiş Örnek:
Select Count(*) FROM Stok S ,(SELECT StokKod,AVG(Fiyat) Fiyat FROM STokHareket GROUP BY StokKod ) SH WHERE SH.StokKod=S.StokKod AND S.Fiyat<2.SH.Fiyat

4- Eğer kesişen kayıt almadığından eminseniz UNION kullanmak yerine UNION ALL kullanmak daha hızlı olacaktır. Çünkü UNION ALL kesişen kayıtlarla uğraşarak vakit kaybetmez.

5- WHERE TO_CHAR(Fiyat) = :fiy yerine WHERE Fiyat = TO_NUMBER(:fiy)

6- ORDER BY,NOT IN,IN,UNION,DISTINCT gibi ifadeler kullanılırken dikkatli olmak lazım çünkü maliyeti çok yüksek.

7- Doğru yerde doğru indeks kullanımı çok önemlidir. Nerede indeks kullanmalı konusu  biraz tecrübe ve biraz da sistemin genel yapısı ile alakalıdır.

8- Çok sık değişen ve küçük tablolarda indeks kullanmak çok da doğru değildir.

9- Genel olarak bütün mantığımız execution planı mümkün olduğu kadar az çalıştırtmak. Library Cache mizde yeteri kadar sorgu çalışmış olmalı. Eğer oracle veritabanı uzun süre çalıştıktan sonra kapanırsa açılınca performansı düşük olacaktır çünkü cache’deki bütün execution planlar silinmş olacaktır. O yüzden veritabanını kapatmamalıyız.

10-Materalized View kullanmak : Eğer sık değişen büyük veriniz varsa mutlaka kullanın.

11- Bir sorguda AND ile bağlanan iki filtre varsa WHERE ad=’KORAY’ AND Soyad=’adsds’ ikili index yapmak bu sorguyu daha çok performanslı çalıştırır.

12- Index kullanırken de ne tip index tipini doğru seçmek gerekir. İki tip indeksimiz var. B-tree ve Bitmap Index. Hangisini kullanacağımıza doğru karar vermek çok önemli. Veri tekrarı az ise B-Tree : Örnek kolon stok kodu , Tekrar eden kayıt çok ise Bitmap : Örnek Cinsiyet. Primary Key ve Unique Key kolonlar B-TREE indekse örnektir.

13- Partition Yapalım. Range,Hash,List …vs Partitions.

14- Birden fazla CPU varsa paralel indexlerden faydalanalım.

15- Cluster kullanımı: Örneğin bir adı,soyadı,tel gibi bilgi çok fazla yerde kullanılıyorsa buları cluster haline getirebiliriz. CREATE CLUSTER ….

16- INDEX ORGANIZE TABLE : Bir tablo çok fazla değişmiyorsa tabloyu yaratırken indeksli yaratırız ve sıralı bir şekilde kaydeder.Çok hızlı select yavaş insert. Primary Key şart
CREATE TABLE …… ORGANIZATOIN INDEX

17-  Data dağılımları düzgün tablolar için bind variable kullanmak hız kazandırır.Çünkü ilk seferde sorgunun execution planı oluşturulur ve bir sonraki değeri farklı dahi olsa bir önceki plandan işlem görür. Örnek bölge kolonu için her bölgede aşağı yukarı 99 ile 101 kayıt varsa kullanmak mantıklı.

HINTS : Execution Planlara Hint ile baskıda bulunup değiştirtebiliriz ancak 11g ile artık buna çok fazla da ihtiyacımız kalmadı. Zaten en iyi maliyetli planı Oracle buluyor. Ancak spesific durumlarda ve test amaçlı kullanılabilir.

SELECT /*+ INDEX(t name_idx)*/ FROM tablo t where name=’koray’
Oracle Enterprise Manager
Oracle’ın yönetimsel aktivitelerini takip etmek için kullanışlı bir uygulamadır. Bu bir Oracle servisidir ve uzun süre alan sql’leri akalamktan tutunda sqller ile ilgili tavsiye vermeye kadar bir çok işlevi vardır. Ayrıca incelenmesi gereken bir konudur.Biz sadece bazı küçük modüllerini inceleyeceğiz.
1- SQL Tunning Advisor : Oracle Enterprise menüsü üzerinden bu araca gelerek mevcut bir sorgunuza olumlu bir tavsiye alabilirsiniz. Örneğin şu tabloda şu kolonda index yap gibi. Mutlaka kullanılması tavsiye edilir.

2- SQL Access Advisor : Index ve Partition tavsiyesinde bulunur. Daha detaylı tavsiyeler içerir.

Sonuç olarak yazımızda Oracle yapısına kısa bir göz attıktan sonra veritabanımızı nasıl dah etkili hale getip performansını iyileştirebileceğimizi gördük. Umarım yararlı olmuştur.

Herkese İyi çalışmalar.

Kasım 21, 2009 Posted by | Oracle | , , , , | Yorum bırakın

Oracle farklı veritabaları arasında sorgu çalıştırma

Eğer Toad ile iki farklı oracle veritabanlarında sorgu çalıştırmak istersek , yani aynı sorgu içinde iki veritanına ait tablolar kullanılacaksa ne yapmamız gerekir size onu anlatacağım.

 

Öncelikle Toad ta iki veritabanı da TNS name leri eklenir ve sorgu çalıştırılacak veritabanından diğer veritabanına DBLink vermemiz gereklidir.

 

Peki bunu nasıl yapacağız. Toad da sol taraftaki menü de bulunan DB Links e gelip Create New Link dememiz gerekiyor. Daha sonra Link verilecek veritanının zaten TNS name i tanımlı olduğu için Database To Connect denen yere bağlanacağımız veritabanını seçiyoruz. Ve bundan sonra artık bu linki kullanacak veritabanları arasında sorgu çalıştırabiliriz.

 

      Örnek : INSERT /*+ APPEND */ INTO tablo1@LINK_ADI

         SELECT * FROM tablo1;

Haziran 10, 2009 Posted by | Oracle | , , , , , | Yorum bırakın

Oracle ile mail gönderme UTL_MAIL.SEND fonksiyonu

Bu makalemizde web sitelerinde sıklıkla başvurduğumuz bir konu olan mail gönderme işlemlerini ele alacağız.Mail gönderme işlemi .NET te System.Net.Mail; sınıfı ile çok kolay bir şekilde yapılabilmekte ancak bu işlemi uygulamamız üzerinde değil de veritabanında halletmek istiyorsak ve Oracle kullanıyorsak UTL_MAIL.SEND fonksiyonunu kullanmak mantıklı olacaktır.UTL_MAIL package’ı default olarak gelmemekte ve kendimiz bu package’ı eklemek durumundayız. Bu package’ı kullanılabilir hale getirme için yapmamız gerekenler :

 

Başlat-Çalıştır-cmd

Daha sonra C:> dizinine gelinir ve

C:>sqlplus sys as sysdba yazılarak sql programı çalıştırılır.

SQL> start C:oracleproduct10.2.0db_1RDBMSADMINutlmail.sql

package ve sysnonim yaratılır

SQL> start C:oracleproduct10.2.0db_1RDBMSADMINprvtmail.plb

Package body yaratılır.

Bu işlemleri illaki komut komut satırında yapmak zorunda değiliz Bu package’ın scriptlerini belirtilen dizinden bulup Toad’tan da çalıştırabiliriz.Yaratıldığından emin olmak için SYS şeması altında Package’lara bakabiliriz.

 

Daha sonra  smtp_out_server ‘ın mail serverını set etmemiz gerekiyor. Bunun içinde aşağıdaki scripti çalıştırmalıyız.

alter system set smtp_out_server = mailserverIP:25′ scope=both;

Bunu da yaptıktan sonra artık bu package’ı kullanacak userımıza hak vermemiz gerekiyor.Onu da aşağıdaki script ile verebiliriz.

grant execute on sys.utl_mail to Username;

 Mail göndermeyi denemek için şunu yapabiliriz :

EXEC UTL_MAIL.SEND(Gönderen Maili’,’Alıcı Maili’ ,NULL,NULL,’Subject’,’Mesaj’ , ‘text/plain; charset=us-ascii’,NULL);

Çalışmıyorsa muhtemelen haklardan veya mail server ile alakalı bir problem olabilir.

 

Şimdi daha gerçekçi bir örnek yapalım.Örneğin Kullanıcı tablomuz olsun ve tabloda mail adresleri bulunsun. Bizden de kullanıcılara aylık bir bilgilendirme maili atmamız istendi diyelim.Bunu yapabilmek için once bir prosedür oluştururuz ve bu prosedür kullanıcı tablosundaki mail adreslerini toparlar.Bu mailin belirli tarihlerde atılmasını sağlamak için de Oracle JOB tanımlarız. Prosedür Scriptimiz

CREATE OR REPLACE PROCEDURE SEND_MAIL1 IS

pRecipient VARCHAR2(2500) := ”;

pSubject   VARCHAR2(100) := ‘ HATIRLATMA’;

pMessage   VARCHAR2(100) := ‘BİZİ UNUTMAYIN‘;

crlf      CONSTANT VARCHAR2(2):= CHR(13) || CHR(10);

mesg      VARCHAR2(5000) := ‘ ‘;

BEGIN

for xtable in (select email from kullanici WHERE OTHER=1) loop

pRecipient :=  pRecipient || xtable.EMAIL || ‘;’;

end loop;

mesg := ‘Date: ‘ ||

TO_CHAR( SYSDATE, ‘dd Mon yy hh24:mi:ss’) || crlf ||

‘From: ‘ || crlf ||

‘Subject: ‘|| pSubject || crlf ||

‘To: ‘||pRecipient || crlf || ” || crlf || pMessage;

UTL_MAIL.SEND(‘mail@hotmail.com’,pRecipient ,NULL,NULL,pSubject,mesg , ‘text/plain; charset=us-ascii’,NULL);

END;

 

JOB SCRİPTİMİZ : Bu scripti TOAD arayüzü üzerinden de create edebilirsiniz.

BEGIN  SYS.DBMS_JOB.REMOVE(41); COMMIT; END;

DECLARE X NUMBER;

BEGIN

SYS.DBMS_JOB.SUBMIT

( job       => X

,what      => ‘SEND_MAIL1;’

,next_date => to_date(‘01.06.2009 00:00:00′,’dd/mm/yyyy hh24:mi:ss’)

,interval  => ‘TRUNC(LAST_DAY(SYSDATE)) + 1’

,no_parse  => FALSE);

SYS.DBMS_OUTPUT.PUT_LINE(‘Job Number is: ‘ || to_char(x));

SYS.DBMS_JOB.BROKEN

(job    => X,broken => TRUE);

COMMIT; END;

Umarım Yararlı Olmuştur.Herkese iyi günler dilerim.

Mayıs 7, 2009 Posted by | Oracle | , , , , | Yorum bırakın

PL SQL Decode Fonksiyonu

Decode fonksiyonu IF-THEN-ELSE yapısını sorgu içerisinde kolayca yapmamızı sağlar.

 

DECODE(kolon_adi,koşul1,deger1,koşul2,deger2,. . .);

Burada kolonun değeri şu ise değer şu olsun şu ise şu olsun kolayca dememizi sağlıyor. Örneğin şöyle bir şeye ihtiyacınız oldu ; id alanınız var ve siz 1-10 arası kayıtlarınızı katagori1 11-20 arası kayıtlarınızı katagori2 olarak select sorgunuzda göstermek istiyorsunuz.

SELECT id,DECODE(trunc ((id – 1) / 10),0,’katogori1′,1,’katagori2′,2)  FROM TabloAdi

Veya

If yrs_of_service < 1 then return 0.04
If yrs_of_service >= 1 and < 5 then return 0.04
If yrs_of_service > 5 then return 0.06

gibi bir şey yapmak istiyoruz.Sorgusu aşağıdaki gibi olacaktır.1 den küçük değerler için 0,04 yazacaktır.

 

SELECT emp_name,
decode(trunc (( yrs_of_service + 3) / 4), 0, 0.04,
  1, 0.04,
    0.06) as perc_value
FROM employees;

 

 

Detaylar için http://www.techonthenet.com/oracle/functions/decode.php adresini inceleyebilirsiniz.

Nisan 30, 2009 Posted by | Oracle | , , | Yorum bırakın