<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CETURK &#187; Hayrullah Ayan</title>
	<atom:link href="http://www.ceturk.com/etiket/hayrullah-ayan/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ceturk.com</link>
	<description>Türkiye&#039;nin Bilişim Platformu</description>
	<lastBuildDate>Tue, 07 Feb 2012 18:02:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Oracle Veritabanına Kuşbakışı – Sql Tuning – 9. ve 10. Ders</title>
		<link>http://www.ceturk.com/oracle-veritabanina-kusbakisi-%e2%80%93-sql-tuning-%e2%80%93-9-ve-10-ders/</link>
		<comments>http://www.ceturk.com/oracle-veritabanina-kusbakisi-%e2%80%93-sql-tuning-%e2%80%93-9-ve-10-ders/#comments</comments>
		<pubDate>Mon, 28 Feb 2011 09:14:44 +0000</pubDate>
		<dc:creator>hayrullah ayan</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Veri Tabanı]]></category>
		<category><![CDATA[cost-based optimizer]]></category>
		<category><![CDATA[Execution Plan]]></category>
		<category><![CDATA[explain plan]]></category>
		<category><![CDATA[Hayrullah Ayan]]></category>
		<category><![CDATA[Oracle Veritabanına Kuşbakışı Ders Serisi]]></category>
		<category><![CDATA[rule-based optimizer]]></category>
		<category><![CDATA[SQL Hints]]></category>
		<category><![CDATA[SQL optimizer]]></category>
		<category><![CDATA[SQL tuning]]></category>

		<guid isPermaLink="false">http://www.ceturk.com/?p=5298</guid>
		<description><![CDATA[SQL TUNING Daha önceki yazılarımda Oracle ve SQL ile ilgili temel bilgileri vermeye çalıştım.Şimdi ise tüm Oracle developerların çok dikkat etmeleri gereken bir konu; tuning’den bahsedeceğim. Üzerinde çalıştığımız dataların boyutları büyüdükçe, database’i etkili ve verimli kullanmak daha önemli bir hale gelmekte. Yapılması gereken işi aynen yapacak sadece yapış metodunda ufak değişiklikler yaparak büyük verimlilik kazanacagız. [...]]]></description>
			<content:encoded><![CDATA[<p><strong>SQL TUNING</strong></p>
<p><em>Daha önceki yazılarımda Oracle ve SQL ile ilgili temel bilgileri vermeye çalıştım.Şimdi ise tüm Oracle developerların çok dikkat etmeleri gereken bir konu; tuning’den bahsedeceğim. Üzerinde çalıştığımız dataların boyutları büyüdükçe, database’i etkili ve verimli kullanmak daha önemli bir hale gelmekte. Yapılması gereken işi aynen yapacak sadece yapış metodunda ufak değişiklikler yaparak büyük verimlilik kazanacagız.</em></p>
<p><strong> </strong></p>
<p><strong>SQL OPTIMIZER NEDİR ?</strong></p>
<p>Herhangi bir SQL sorgusu çalıştırıldığında, istenilen bilgiye nasıl ulaşılacağına “Optimizer” adı verilen</p>
<p>veri tabanı optimizasyon birleşeni karar vermektedir. Oracle, kullanıcılarına tahminler üzerine çalışan</p>
<p>“Rule-Based Optimizer” ve daha çok akıl yürütme yöntemi ile çalışan “Cost-Based Optimizer” olmak</p>
<p>üzere iki adet optimizasyon seçeneği sunmaktadır.</p>
<p><strong>Rule-Based Optimizer</strong></p>
<p>Veri tabanına ulaşılırken, Rule-Based Optimizer (RBO) ile önceden tanımlanmış kurallar seti</p>
<p>kullanılarak hangi yolun izleneceğine karar verilir. Burada bahsedilen kurallar “<strong>SELECT /*+ RULE</strong></p>
<p><strong>*/. . .</strong>” şeklinde kullanılmaktadır ve böylece veri tabanında hangi indeksin kullanılacağı gibi ek</p>
<p>bilgiler verilmektedir. Eğer bu yöntem kullanılacaksa, RDBMS‘de aşağıdaki tanımlamaların yapılması</p>
<p>gerekmektedir:</p>
<p>• INIT.ORA ya da SPFILE dosyasında OPTIMIZER_MODE = RULE değişikliği yapılmalıdır.</p>
<p>• ALTER SESSION SET OPTIMIZER_MODE = RULE komutu sistemde çalıştırılmalıdır.</p>
<p><strong>Cost-Based Optimizer</strong></p>
<p>Cost-Based Optimizer’ın (CBO) Rule-Based Optimizer‘a göre daha kapsamlı ve karışık bir çalışma</p>
<p>prensibi bulunmaktadır. Kullanılacak olan en iyi yöntemi belirlenirken, çeşitli veri tabanı bilgileri (tablo</p>
<p>boyutları, kayıt sayıları, verilerin dağılımı vs.) kullanılmaktadır.</p>
<p>Cost-Based Optimizer‘ının ihtiyacı olan veriyi sağlamak için veri tabanı objelerinin DBMS_STATS</p>
<p>prosedürü kullanılarak analiz edilmeleri ve istatistiklerinin toplatılması gerekmektedir. Eğer bir tablonun</p>
<p>analizi yapılmamışsa, Rule-Based Optimizer‘ın kuralları kullanılarak yolu belirlenir. Aynı sorguda bazı</p>
<p>tablolar analiz edilmiş ve bazıları analiz edilmemiş ise, sistem öncelikli olarak Cost-Based Optimizer‘ını</p>
<p>kullanır. Eğer bu yöntem kullanılacaksa; RDBMS‘de aşağıdaki tanımlamaların yapılması</p>
<p>gerekmektedir:</p>
<p>• INIT.ORA/SPFILE dosyasında OPTIMIZER_MODE = CHOOSE değişikliği yapılmalıdır ve</p>
<p>sorgudaki tablolardan en az bir tanesinin istatistik bilgilerinin mevcut olması gerekmektedir.</p>
<p>• ALTER SESSION SET OPTIMIZER_MODE = CHOOSE komutu sistemde çalıştırılmalıdır ve</p>
<p>sorgudaki tablolardan en az bir tanesinin istatistik bilgilerinin mevcut olması gerekmektedir.</p>
<p>• ALTER SESSION SET OPTIMIZER_MODE = FIRST_ROWS ( veya ALL_ROWS ) komutu</p>
<p>sistemde çalıştırılmalıdır ve sorgudaki tablolardan en az bir tanesinin istatistik bilgilerinin</p>
<p>hesaplanmış olması gerekmektedir.</p>
<p><strong> </strong></p>
<p><strong>Explain Plan Tablosu</strong></p>
<p>Oracle‘da bir sorgunun çalışmasının sisteme olan maliyet bilgileri, EXPLAIN PLAN sayesinde</p>
<p>hesaplanabilmektedir. Kullanılan plan tablosunun COST kolonunda sorgunun sisteme olan yükünün</p>
<p>hesaplanmış değeri tutulmaktadır. Kullanılan optimizerin çalışma yolunu değiştirerek ( sorguya</p>
<p>yardımcı ek kurallar koyarak, indeks ekleyerek, indeks kaldırarak, nesnelerin analizini yaparak vs. )</p>
<p>hesaplanan yükteki yükselmeler ve azalmalar gözlemlenir. Böylece sorgunun en uygun maliyeti veren</p>
<p>çalıştırma yöntemi seçilir.</p>
<p><strong>FILTER </strong>Korelasyon alt sorgusu gibi eşleşen kayıtları daha kaliteli bir hale getirmek</p>
<p>için sorguda uygulanacak kriterdir.</p>
<p><strong>FULL TABLE SCAN </strong>Tablo ilk kayıttan son kayıda kadar taranmakta ve herhangi bir indeks</p>
<p>kullanılmamaktadır.</p>
<p><strong>INDEX (UNIQUE) </strong>SQL sorgusu belirli bir değeri aramak için unique ( her satır için ayrı tek</p>
<p>kayıt ) indeks kullanmaktadır.</p>
<p><strong>INDEX (RANGE SCAN) </strong>SQL sorgusunda eşitsizlik ya da BETWEEN kriteri kullanılmaktadır.</p>
<p><strong>HASH JOIN </strong>SQL sorgusundaki tablolar okunur ve hash-key olarak bilinen bir</p>
<p>matematiksel hesaplama ile hafızaya alınırlar.</p>
<p><strong>MERGE JOIN </strong>SQL sorgusunda FROM cümleciğinde birden fazla tablo yer aldığı zaman</p>
<p>bu birleştirme yöntemi kullanılır. Oracle, iki sonuç tablosunu birleşen</p>
<p>sütunlar üzerinde biraraya getirerek sıralayacak ve sonra birleşen sütunlar</p>
<p>yardımıyla sonuçları biraraya getirecektir.</p>
<p><strong>NESTED LOOP </strong>Bu işlem, tabloları birleştirmenin bir başka yöntemidir. İç içe kullanılan</p>
<p>döngü anlamına gelen yöntemde sistem paralel olarak birleştirilen</p>
<p>indeksler üzerinde döngü içinde ilerleyerek sonuca ulaşmaya çalışmaktır.</p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong>SQL OPTİMİZASYON ÖNERİLERİ</strong></p>
<p><strong>Birden fazla sorgu kullanılması</strong></p>
<p>X  <strong><em>Önerilmez</em></strong></p>
<pre class="brush: sql">SELECT name

FROM products

WHERE product_id = 1;

SELECT type_name

FROM product_type

WHERE product_type_id = 1;</pre>
<p>è  <strong><em>Önerilir</em></strong></p>
<pre class="brush: sql">SELECT p.name,

pt.type_name

FROM products p,

product_type pt

WHERE p.product_type_id = pt.product_type_id

AND p.product_id = 1;</pre>
<p>Bir yerine iki query çalıştırmak her zaman daha çok iş gücüdür.</p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong>Tablo kolon tanımları kullanımı</strong></p>
<p>X  <strong><em>Önerilmez</em></strong></p>
<pre class="brush: sql">SELECT p.name,

pt.type_name,

description,

price

FROM products p,

product_type pt

WHERE p.product_type_id = pt. product_type_id

AND p.product_id = 1;
</pre>
<p>è <strong><em>Önerilir</em></strong></p>
<pre class="brush: sql">SELECT p.name,

pt.type_name,

p.description,

p.price

FROM products p,

product_type pt

WHERE p.product_type_id = pt. product_type_id

AND p.product_id = 1;
</pre>
<p>Referans verilmezse veri tabanı tüm tablolarda bu alanlar için arama yapmakta ve sorgu daha yavaş</p>
<p>çalışmaktadır.</p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong>HAVING yerine WHERE kullanımı</strong></p>
<p>X  <strong><em>Önerilmez</em></strong></p>
<pre class="brush: sql">SELECT product_type_id,

AVG(price)

FROM products

GROUP BY product_type_id

HAVING product_type_id IN ( 1, 2 );
</pre>
<p>è  <strong><em>Önerilir</em></strong></p>
<pre class="brush: sql">SELECT product_type_id,

AVG(price)

FROM products

WHERE product_type_id IN ( 1, 2 )

GROUP BY product_type_id;
</pre>
<p>İkincisi işlemin başlangıcında kayıtları sınırlarken, ilkinde tüm kayıtlar için AVG çalıştırılmaktadır.</p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong>UNION yerine UNION ALL kullanımı</strong></p>
<p>X  <strong><em>Önerilmez</em></strong></p>
<pre class="brush: sql">SELECT product_id,

product_type_id,

name

FROM products

UNION

SELECT product_id,

product_type_id,

name

FROM more_products;
</pre>
<p>è <strong><em>Önerilir</em></strong></p>
<pre class="brush: sql">SELECT product_id,

product_type_id,

name

FROM products

UNION ALL

SELECT product_id,

product_type_id,

name

FROM more_products;
</pre>
<p>UNION ALL her iki sorgu sonucunda tüm kayıtları getirirken, UNION tekrarlanan kayıtları elemektedir.</p>
<p>Bu nedenle, gerçekleşen eleme işleminden dolayı UNION ALL daha hızlıdır ve sistemi yormaz.</p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong>IN yerine EXISTS kullanımı</strong></p>
<p>X  <strong><em>Önerilmez</em></strong></p>
<pre class="brush: sql">SELECT product_id,

name

FROM products

WHERE product_id IN (

SELECT product_id

FROM purchases );
</pre>
<p>è <strong><em>Önerilir</em></strong></p>
<pre class="brush: sql">SELECT product_id,

name

FROM products pr

WHERE EXISTS (

SELECT 1

FROM purchases pu

WHERE pu.product_id = pr.product_id );
</pre>
<p>IN bir listede aranan verinin olup olmadığını kontrol eder. EXISTS sadece kayıtların varlığını kontrol</p>
<p>ederken, IN ise gerçek verileri kontrol eder. Alt sorgularda EXISTS daha iyi sonuçlar verdiğinden tercih</p>
<p>edilmelidir.</p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong>DISTINCT yerine EXISTS kullanımı</strong></p>
<p>X  <strong><em>Önerilmez</em></strong></p>
<pre class="brush: sql">SELECT DISTINCT product_id,

name

FROM products pr,

purchase pu

WHERE pr.product_id = pu.product_id;
</pre>
<p>è <strong><em>Önerilir</em></strong></p>
<pre class="brush: sql">SELECT product_id,

name

FROM products pr

WHERE EXISTS

( SELECT 1

FROM purchase pr

WHERE pr.product_id = pu.product_id);
</pre>
<p>Sorguda gelen kayıtlarda tekrarlı olanları görüntülememek için DISTINCT kullanılır. EXISTS ise bir alt</p>
<p>sorguda gelen kayıtlar içinde istenilenlerin olup olmadığını kontrol eder. DISTINCT, gelen sonuçlarda</p>
<p>tekrarlı olanları belirlemeden önce sıralama yaptığıdan verimsizdir ve bu yüzden de EXISTS tercih</p>
<p>edilmelidir.</p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong>OR yerine UNION kullanımı</strong></p>
<p>X  <strong><em>Önerilmez</em></strong></p>
<pre class="brush: sql">SELECT ...

FROM ps_jrnl_header a

WHERE jrnl_hdr_status = ‘E’

OR EXISTS

( SELECT ‘x’

FROM ps_jrnl_header

WHERE business_unit_js = a.business.unit_js

AND journal_id = a.journal_id

AND unpost_seq = a.unpost_seq

AND jrnl_hdr_status = ‘E’ );
</pre>
<p>è <strong><em>Önerilir</em></strong></p>
<pre class="brush: sql">SELECT ...

FROM ps_jrnl_header a

WHERE jrnl_hdr_status = ‘E’

UNION

SELECT ...

FROM ps_jrnl_header a,

ps_jrnl_header b

WHERE a.business_unit_js = b.business.unit_js

AND a.journal_id = b.journal_id

AND a.unpost_seq = b.unpost_seq

AND a.jrnl_hdr_status = ‘E’

AND b.jrnl_hdr_status != ‘E’;
</pre>
<p>UNION kullanıldığında, optimizer kayıtları getirmek için iki benzer işlem gerçekleştirir. OR yapısında</p>
<p>ise optimizer karar verirken daha karmaşık işlemler yapar ve daha az verimli sonuçlara ulaşır.</p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong>Düzensiz SQL sorguları</strong></p>
<p>X  <strong><em>Önerilmez</em></strong></p>
<p>İlk sorguda product_id için 1 değeri verilirken, ikincisi için 2 değeri verilmektedir.</p>
<pre class="brush: sql">SELECT * FROM products WHERE product_id = 1;

SELECT * FROM products WHERE product_id = 2;
</pre>
<p>Sorgular aynı olmalarına rağmen farklı yerlerde boşluk karakterleri ile karşılaşılmaktadır.</p>
<pre class="brush: sql">SELECT * FROM products WHERE product_id = 1;

SELECT * FROM products WHERE product_id = 1;
</pre>
<p>Sorgularda karakterlerin büyük harf ve küçük harfle yazılmasına önem verilmemiştir.</p>
<pre class="brush: sql">select * FROM products WHERE product_id = 1;

SELECT * from products WHERE product_id = 1;
</pre>
<p><strong>Indeks kullanımını engelleyen durumlar</strong></p>
<p>X  <strong><em>Önerilmez</em></strong></p>
<p><strong>&#8230;</strong></p>
<pre class="brush: sql">WHERE SUBSTR(account_name,1,7) = ‘CAPITAL’
</pre>
<p>è <strong><em>Önerilir</em></strong></p>
<p><strong>&#8230;</strong></p>
<pre class="brush: sql">WHERE account_name LIKE ‘CAPITAL%’
</pre>
<p>SUBSTR indeks kullanımını iptal eder.</p>
<p>X  <strong><em>Önerilmez</em></strong></p>
<p><strong>&#8230;</strong></p>
<pre class="brush: sql">WHERE account != 0
</pre>
<p>è <strong><em>Önerilir</em></strong></p>
<p><strong>&#8230;</strong></p>
<pre class="brush: sql">WHERE account &gt; 0
</pre>
<p>NOT, !=, &lt;&gt; indeks kullanımını iptal eder.</p>
<p>X  <strong><em>Önerilmez</em></strong></p>
<p><strong>&#8230;</strong></p>
<pre class="brush: sql">WHERE TRUNC(trans_date) = TRUNC(sysdate)
</pre>
<p>è <strong><em>Önerilir</em></strong></p>
<p><strong>&#8230;</strong></p>
<pre class="brush: sql">WHERE trans_date BETWEEN TRUNC(sysdate) AND

TRUNC(sysdate) + 0.99999
</pre>
<p>TRUNC indeks kullanımını iptal eder.</p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p>X  <strong><em>Önerilmez</em></strong></p>
<p><strong>&#8230;</strong></p>
<pre class="brush: sql">WHERE account_name || account_type = ‘AMEXA’
</pre>
<p>è <strong><em>Önerilir</em></strong></p>
<p><strong>&#8230;</strong></p>
<pre class="brush: sql">WHERE account_name = ‘AMEX’

AND account_type = ‘A’
</pre>
<p>“||” (concatenate) indeks kullanımını iptal eder.</p>
<p>X  <strong><em>Önerilmez</em></strong></p>
<p><strong>&#8230;</strong></p>
<pre class="brush: sql">WHERE account_name = NVL ( :acc_name, account_name )
</pre>
<p>è <strong><em>Önerilir</em></strong></p>
<p><strong>&#8230;</strong></p>
<pre class="brush: sql">WHERE account_name LIKE NVL ( :acc_name, ‘%’ )
</pre>
<p>Account_name her iki tarafta da kullanılırsa indeks iptal edilir.</p>
<p>X  <strong><em>Önerilmez</em></strong></p>
<p><strong>&#8230;</strong></p>
<pre class="brush: sql">WHERE emp_type = 123
</pre>
<p>è <strong><em>Önerilir</em></strong></p>
<p><strong>&#8230;</strong></p>
<pre class="brush: sql">WHERE TO_NUMBER(emp_type) = 123
</pre>
<p>Emp_type VARCHAR2 tipinde olduğu için farklı tipteki değişken ile karşılaştırıldığında indeks iptal</p>
<p>edilir.</p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong>Sıralama için Indeks kullanımı</strong></p>
<p>Indeksler, sıralama için fazladan işlem yapılamasını önlemek amacıyla da kullanılabilir. Genel olarak</p>
<p>indeksler artan bir sırayla oluşturulurlar. Eğer sorgudaki ORDER BY kalıbında yer alan kolonlar</p>
<p>indeksteki sıralarıyla aynıysa, bu sorguya ilgili indeksi kullandırmak verinin istenilen sırada ve hızlı bir</p>
<p>şekilde getirilmesini sağlar.</p>
<p>X  <strong><em>Önerilmez</em></strong></p>
<pre class="brush: sql">SELECT acc_name,

acc_surname,

FROM account_acct

ORDER BY account_name;
</pre>
<p>Bu sorgunun yardım cümleciği yazılarak indeks kullanması aşağıdaki şekilde sağlanabilir:</p>
<p>è <strong><em>Önerilir</em></strong></p>
<pre class="brush: sql">SELECT /* INDEX_ASC(acct acc_ndx1) */ acc_name,

acc_surname,

FROM account_acct

ORDER BY account_name;
</pre>
<p>Bazı durumlarda, ORDER BY yerine anlamsız bir WHERE koşulu eklenmesi daha hızlı çalışmayı</p>
<p>sağlayabilir. Aşağıdaki örnekte WHERE acc_name &gt; chr(1) kullanılarak indeks kullanılması ve böylece</p>
<p>sıralama yapılması sağlanmıştır.</p>
<p>è <strong><em>Önerilir</em></strong></p>
<pre class="brush: sql">SELECT /* INDEX_ASC(acct acc_ndx1) */ acc_name,

acc_surname,

FROM account_acct

WHERE acc_name &gt; chr(1) ;
</pre>
<p><strong>SQL YARDIM CÜMLECİKLERİ</strong></p>
<p>Aşağıda genel olarak Oracle9i’de bulunan yardım cümlecikleri görülmektedir. Bu yardım</p>
<p>cümleciklerinin çoğu daha önceki Oracle sürümlerinde de desteklenmektedir. Aşağıdaki açıklamalarda</p>
<p>sadece söz dizilim yapısı değil, aynı zamanda bu yardım cümleciklerinin en sık kullanılım şekilleri de</p>
<p>bulunmaktadır.</p>
<p><strong>STAR</strong></p>
<p>Sorgudaki en büyük tablonun birleştirmede en sona alınmasını temin eder. Veri ambarı</p>
<p>uygulamalarında bu yardım cümleciği sıkça kullanılır. En az üç tablo kullanıldığında STAR daha</p>
<p>verimlidir.</p>
<pre class="brush: sql">SELECT /*+ STAR */ h.horse_name, o.owner,

r.position, r.location, r.race_date

FROM results r, horses h, owners o

WHERE h.horse_name like 'WI%'

AND h.horse_name = r.horse_name

AND r.owner = o.owner;
</pre>
<p>STAR_TRANSFORMATION</p>
<p>Boyut tablolarında ve ana tablolarda STAR yardım cümleciğine benzer şekilde kullanılır. En belirgin</p>
<p>fark ise, Cost-Based Optimizer’ın sorguyu dönüştürmeye değip değmeyeceğine karar vermesidir.</p>
<p>Dönüştürmede, SQL kalıbı alt sorgulara bölünerek bitmap indekslerden yararlanması sağlanır. Bu</p>
<p>yardım cümleciğinin kullanılabilmesi için Oracle parametresi</p>
<p>STAR_TRANSFORMATION_ENABLED=TRUE olarak ayarlanmalıdır. STAR_ TRANSFORMATION</p>
<p>genellikle ana tablo kolonları üzerinde bitmap indeksleri kullanmaya çalışır ve bunu cümleyi alt</p>
<p>sorgulara bölerek yapar.</p>
<p>SELECT /*+ STAR_TRANSFORMATION */</p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong>PARALLEL(table [,integer] [,integer])</strong></p>
<p>Sorguyu çalıştırmak için kullanılacak eş zamanlı proses sayısını belirler. İlk parametre, tablo için</p>
<p>paralelliğin seviyesini belirler. Her bir sorgu için koşacak proses sayısına denktir. İkinci seçimli</p>
<p>parametre ise, sorgunun kaç parçaya bölünüp koşturulacağını belirler. Eğer PARALLEL(EMP,4,2) gibi</p>
<p>bir tanımlama yapılırsa, iki ayrı sorgu parçası üzerinde 4 tane proses koşacak anlamına gelmektedir.</p>
<p>Eğer hiçbir değer girilmezse, INIT.ORA ya da SPFILE’da tanımlı olan genel parametrelere uyulur. Bu</p>
<p>yardım cümleciği select, update, insert ve delete cümlelerinde kullanılabilir. Paralel çalışma özelliğinin</p>
<p>faydalı olması için veri tabanı dosyaları birçok disk üzerine yayılmış olmalıdır. Dolayısıyla PARALLEL</p>
<p>için girilen paralellik değeri, dosyanın yayıldığı disk sayısını geçmemelidir. Ancak birçok disk</p>
<p>kullanılmışsa, çok sayıda CPU’ya sahip olmak işlemleri daha da hızlandıracaktır.</p>
<pre class="brush: sql">SELECT /*+ PARALLEL (x 4) */ COUNT(*)

FROM x;

SELECT /*+ PARALLEL (x 4 2) */ COUNT(*)

FROM x;

UPDATE /*+ PARALLEL (x 4) */ x

SET position = position+1;

DELETE /*+ parallel(x 4) */ from x;

INSERT INTO x

SELECT /*+ PARALLEL(winners 4) */ *

FROM winners;
</pre>
<p>PARALLEL_INDEX(table, index, degree of parallelism, cluster split)</p>
<p>Bölünmüş indeksler için indeks taramalarının paralelleştirilmesini sağlar. Aşağıdaki örnekte de</p>
<p>görüldüğü gibi, optimizerın EMP tablosu üzerinde paralel indeks taraması yapılması sağlanır.</p>
<p>SELECT /*+ PARALLEL_INDEX(emp, emp_ndx, 4, 2) */</p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong>FIRST_ROWS or FIRST_ROWS(n)</strong></p>
<p>Çağırılan sorgunun ilk n kaydını en kısa sürede dönecek şekilde optimizasyon sağlar. SQL</p>
<p>cümlesindeki herhangi bir tablo için istatistik bilgisinin olması şart değildir, optimizer tarafından bu</p>
<p>istatistikler hesaplanır. Diğer erişim (“access path”) yardım cümlecikleri, FIRST_ROWS cümleciğiyle</p>
<p>birlikte kullanılabilir ve hatta FIRST_ROWS’u ezebilirler. Eğer dönmesi istenen satır sayısına dair (n)</p>
<p>parametresi belirtilirse, Oracle daha doğru tahminde bulunur ve böylece daha doğru bir plan uygular.</p>
<p>(n) seçeneği sadece Oracle9i ve üst sürümleri için geçerlidir.</p>
<p>• Tam tablo arama (Full table scan) yerine, her zaman indeks kullanır.</p>
<p>• Mümkünse sort/merge birleşimleri yerine, iç içe döngü birleşimlerini kullanır.</p>
<p>• Mümkünse, ORDER BY kalıbı için indeks kullanır.</p>
<p>DELETE ve UPDATE cümleleri, gruplama işlemi (UNION, INTERSECT, MINUS, GROUP BY,</p>
<p>DISTINCT, MAX, MIN, SUM gibi) ya da FOR UPDATE kalıbı içeren sorgularda optimizer</p>
<p>FIRST_ROWS yardım cümleciğini işleme almaz. Çünkü bu işlemlerde mutlaka tüm kayıtlara erişilmesi</p>
<p>gerekeceğinden en hızlı cevap optimizasyonu yapılamaz.</p>
<p><strong>SELECT /*+ FIRST_ROWS(100) */</strong></p>
<p><strong>FULL(table)</strong></p>
<p>Belirtilen tablo üzerinde tam tarama yapılmasını sağlar.</p>
<pre class="brush: sql">SELECT /*+ FULL(emp) */ ename

FROM emp

WHERE commencement_date &gt; sysdate - 7
</pre>
<p>Eğer tablo için kısa ad (alias) tanımlanmışsa, yardım cümleciğinde de bu kısa ad kullanılmalıdır:</p>
<pre class="brush: sql">SELECT /*+ FULL(a) */ ename

FROM emp a

WHERE a.commencement_date &gt; sysdate - 7
</pre>
<p><strong>INDEX(table [index [index...]])</strong></p>
<p>Belirtilen tablo için indeksi üzerinden tam tarama yapılmasını sağlar. Yardım cümleciğinde bir ya da</p>
<p>birden fazla indeksin adı da doğrudan tanımlanabilir. Eğer indeks adı verilmemişse, optimizer tüm</p>
<p>indeksleri kontrol eder ve en uygun olanı ya da olanları plana dahil eder. Eğer doğrudan isimleri</p>
<p>verilmiş ise, optimizer bu indeksler içinde uygun olan ya da olanları seçer. Sadece tek bir indeks</p>
<p>verilmişse optimizer bu indeksi kullanır.</p>
<p><strong>SELECT /*+ INDEX(EMP EMP_NDX1) */</strong></p>
<p><strong>SELECT /*+ INDEX(EMP) */</strong></p>
<p><strong>INDEX_ASC(table [index])</strong></p>
<p>Belirtilen tablo üzerinde artan indeks taraması yapılmasını sağlar.</p>
<p><strong>CREATE INDEX POST ON OWNERS (ZIPCODE) REVERSE.</strong></p>
<p><strong>SELECT /*+ INDEX_ASC(EMP EMP_NDX1) */&#8230;</strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong>INDEX_COMBINE(table [index [index...]])</strong></p>
<p>Tablo bilgilerine ulaşmak için bitmap indekslere erişimi sağlar.</p>
<p><strong>SELECT /*+ INDEX_COMBINE(ACCT_TRAN AT_STATE_BMI AT_TYPE_BMI) */</strong></p>
<p><strong>INDEX_DESC(table [index])</strong></p>
<p>Belirtilen tablo üzerinde azalan indeks taraması yapılmasını sağlar. Oracle normalde varsayılan olarak</p>
<p>artan indeks taraması gerçekleştirir. Bu yardım cümleciği ise bunun tam tersinin gerçekleşmesini</p>
<p>sağlar. Tipik bir kullanım örneği olarak, banka hesabınızdaki işlemlerin tarihe göre azalan bir şekilde</p>
<p>listelenmesi gösterilebilir. Dağıtılmış sorgularda bu yardım cümleciği büyük fayda sağlar.</p>
<p><strong>SELECT /*+ INDEX_DESC(ACCT_TRANS ACCT_TRANS_DATE_NDX) */&#8230;</strong></p>
<p><strong>INDEX_FFS(table [index])</strong></p>
<p>Optimizer’ın tam tablo taraması yerine tam indeks taraması yapmasını sağlar. WHERE kalıbında</p>
<p>belirtilen kolonların hepsi indeks içinde mevcutsa bu yardım cümleciği verimli çalışır.</p>
<p><strong>SELECT /*+ INDEX_FFS(ACCT_TRAN AT_STATE_NDX1) */</strong></p>
<p><strong>INDEX_JOIN(table [index] table [index2)]</strong></p>
<p>Bu yardım cümleciği erişim yolu olarak belirtilen iki indeksin birleşiminin kullanılmasını sağlar.</p>
<p>Aşağıdaki örnekte, tablonun HORSE_NAME ve OWNER adlı iki birincil anahtar indeksli kolonları ve</p>
<p>IDENTIFIER adlı birincil olmayan anahtar indeksli kolon WHERE koşuluna dahildir.</p>
<pre class="brush: sql">SELECT /*+ INDEX_JOIN(HORSE_OWNERS HO_NDX2 HO_PK) */ Horse_name,

owner

FROM HORSE_OWNERS

WHERE horse_name = 'WILD CHARM'

AND owner = 'Mr M A Gurry'

AND identifier = 10;
</pre>
<p>INDEX_JOIN yardım cümleciği kullanılmadığında, optimizer sadece tek kolonlu indeksleri bir araya</p>
<p>getirir.</p>
<p><strong> </strong><strong> </strong></p>
<p><strong>REWRITE</strong></p>
<p>Belirtilen tablo üzerindeki sorguda eğer varsa materialized view kullanılmasını sağlar. Aşağıdaki</p>
<p>örnekte, at yarışı sonuçlarını tutan bir tablo kullanılmaktadır. OWNER, HORSE_NAME, POSITION ve</p>
<p>COUNT(*) bilgileri için materialized view şu şekilde oluşturulur :</p>
<pre class="brush: sql">CREATE MATERIALIZE VIEW LOG ON RESULTS

WITH ROWID,

PRIMARY KEY (HORSE_NAME, OWNER, RACE_DATE)

INCLUDING NEW VALUES;

CREATE MATERIALIZED VIEW winning_horse_owners_vw

USING INDEX

REFRESH ON COMMIT

ENABLE QUERY REWRITE AS

SELECT horse_name, owner, position, COUNT(*)

FROM results

GROUP BY horse_name, owner, position;
</pre>
<p>Bu materialized view’ın doğrudan erişim dışında da faydalı olması için, Oracle parametresi</p>
<p>QUERY_REWRITE_ENABLED=TRUE olmalı ve ilgili şema QUERY REWRITE yetkisine sahip</p>
<p>olmalıdır. Örneğin ;</p>
<pre class="brush: sql">GRANT QUERY REWRITE TO HROA;
</pre>
<p>Aşağıda görülen SQL sorgusu istediği tüm verileri materialized view’dan alabileceğinden optimizer</p>
<p>tablo yerine materialized view’ı kullanmayı tercih eder.</p>
<pre class="brush: sql">SELECT /*+ REWRITE */ horse_name, owner, position, COUNT(*)

FROM results

GROUP BY horse_name, owner, position;
</pre>
<p><strong>ROWID(table)</strong></p>
<p>Belirtilen tablo için ROWID bazında tablo taraması yapar. “rowid”, kayıdın fiziksel disk adresine karşılık</p>
<p>düşmektedir.</p>
<pre class="brush: sql">SELECT /*+ ROWID(a) */ ename

FROM emp a

WHERE rowid &gt; 'AAAGJ2AAIAAABn4AAA'

AND surname like 'GURR%'
</pre>
<p><strong> </strong><strong> </strong></p>
<p><strong>ALL_ROWS</strong></p>
<p>Çalıştırılan sorguda tüm kayıtları getirmek için en az kaynak tüketimini sağlar.</p>
<p>“OPTIMIZER_MODE=CHOOSE” durumunda çalışılıyorsa ve SELECT, UPDATE veya DELETE</p>
<p>komutlarına uygulanırsa, SORT MERGE veya HASH JOIN içeren iç içe kurulan döngülerin (NESTED</p>
<p>LOOP) ezilmesine neden olabilir.</p>
<p><strong>SELECT /*+ ALL_ROWS */ &#8230;</strong></p>
<p><strong>AND_EQUAL (table index1 index2[... index5])</strong></p>
<p>Tek kolonlu indekslerin birleştirilmesini sağlar. En az iki indeks ve en fazla beş indeks kullanılabilir.</p>
<p>Eğer WHERE koşulundaki ilk indeksten dönen kayıt arttıkça bu indeks birleştirme işleminin verimi de</p>
<p>azalır.</p>
<pre class="brush: sql">SELECT /*+ AND_EQUAL(horse_owners ho_ndx1 ho_ndx2 ho_ndx3) */

count(*)

FROM horse_owners

WHERE horse_name = 'WILD CHARM'

AND owner = 'Mr M A Gurry'

AND identifier = 14;
</pre>
<p><strong>APPEND</strong></p>
<p>Tabloya doğrudan erişip kayıt eklenmesini sağlar. Eklenecek kayıtlar normalde girilen “Buffer Cache”</p>
<p>alanını atlayarak doğrudan tablonun sonuna eklenir. Yükleme sırasında bütünlük kısıtları göz ardı</p>
<p>edilir, fakat yükleme bittiğinde bu kontroller gerçekleştirilir.</p>
<p><strong>INSERT /*+ APPEND */ * INTO y</strong></p>
<p><strong>SELECT FROM winners;</strong></p>
<p><strong>CACHE (table)</strong></p>
<p>Optimizer’ın tam tablo erişimiyle (full table scan) elde edilen veri bloklarının tümünün bellekteki “Buffer</p>
<p>Cache” alanına yüklemesini sağlar. Bu yardım cümleciği genellikle küçük tablolar için kullanılsa da</p>
<p>eğer veri tabanı sunucusunda çok fazla bellek varsa, çok nadiren değişen büyük tablolar da bu şekilde</p>
<p>belleğe yüklenebilir.</p>
<pre class="brush: sql">SELECT /*+ FULL(winners) CACHE(winners)*/

count(*)

FROM winners
</pre>
<p><strong>CHOOSE</strong></p>
<p>Sorgudaki tablolar için veri tabanı istatistikleri mevcutsa optimizerın “cost-based” çalışmasını, eğer</p>
<p>istatistik verisi yoksa “rule-based” çalışmasını sağlar.</p>
<p><strong>SELECT /*+ CHOOSE */</strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong>MERGE(table)</strong></p>
<p>Asıl dış sorgu ile içeride oluşturulan sorgunun (view) birleştirilmesini sağlar. Aşağıdaki örnekte</p>
<p>GROUP BY’lı iç sorgu dışarıdaki OWNERS tablosundaki seçimlerle birleştirilir.</p>
<pre class="brush: sql">SELECT /*+ MERGE(w) */ o.owner,

w.num_wins, o.suburb

FROM owners o,

(SELECT owner, count(*) num_wins

FROM winners

WHERE position = 1

GROUP BY owner) w

WHERE o.owner = w.owner

AND w.num_wins &gt; 15

ORDER BY w.num_wins desc
</pre>
<p><strong>NO_EXPAND</strong></p>
<p>Sorgunun ayrı parçalara bölünüp işlenmesini önler.</p>
<pre class="brush: sql">SELECT /*+ NO_EXPAND */ COUNT(*)

FROM horse_owners

WHERE identifier &lt; 10 OR identifier &gt; 20
</pre>
<p><strong>NO_MERGE(table)</strong></p>
<p>İç sorgunun birleştirilmesini engeller.</p>
<pre class="brush: sql">SELECT /*+ NO_MERGE(w) */ o.owner,

w.num_wins, o.suburb

FROM owners o,

(SELECT owner, count(*) num_wins

FROM winners

WHERE position = 1

GROUP BY owner) w

WHERE o.owner = w.owner

AND w.num_wins &gt; 15

ORDER BY w.num_wins desc
</pre>
<p><strong> </strong><strong> </strong></p>
<p><strong>NOAPPEND</strong></p>
<p>APPEND yardım cümleciğinin aksine tablonun içine geleneksel şekilde kayıt eklenmesini sağlar. Yeni</p>
<p>kayıtların tablonun sonuna ekleneceğinin garantisi yoktur. İçeri atılan kayıtlar “buffer cache” bellek</p>
<p>alanından geçerler ve bütünlük kısıtlarıyla da kontrol edilirler.</p>
<p><strong>INSERT /*+ NOAPPEND */ * INTO y</strong></p>
<p><strong>SELECT FROM winners;</strong></p>
<pre class="brush: sql">SELECT /*+ FULL(winners) NOCACHE(winners) */ count(*)

FROM winners
</pre>
<p><strong> </strong></p>
<p><strong>NOINDEX(table [index [index...]])</strong></p>
<p>Sorguda belirtilen indekslerin planda hesaba katılmamasını temin eder.</p>
<p><strong>SELECT /*+ NOINDEX(EMP EMP_NDX1) */</strong></p>
<p>Eğer sadece tablo adı verilmişse tabloda tanımlı hiçbir indeks kullanılmaz.</p>
<p><strong>SELECT /*+ NOINDEX(EMP) */</strong></p>
<p><strong> </strong></p>
<p><strong>NOPARALLEL(table)</strong></p>
<p>Oracle’ın belirtilen tablonun taranmasında çoklu proses kullanmasını engeller. Örneğin, aşağıdaki</p>
<p>şekilde paralellik kurulmuş olsun:</p>
<pre class="brush: sql">ALTER TABLE x PARALLEL 2;
</pre>
<p>Bu durumda, tablo taranacağında Oracle iki paralel proses kullanır. Takip eden sorgu ise</p>
<p>NOPARALLEL yardım cümleciği ile paralel proses oluşturulmasını engeller.</p>
<p><strong>SELECT /*+ NOPARALLEL(x) */ COUNT(*)</strong></p>
<p><strong>NOPARALLEL_INDEX(table, index)</strong></p>
<p>Bölünmüş (partitioned) indeks için paralel indeks işlenmesine engel olur.</p>
<p><strong>SELECT /*+ NOPARALLEL_INDEX(emp, emp_ndx) */</strong></p>
<p><strong> </strong></p>
<p><strong>NOREWRITE</strong></p>
<p>Seçilen tablo için yazılan sorguların Oracle tarafından varsa ilgili “Materialized View”’ları kullanacak</p>
<p>şekilde değiştirilmesine engel olur. REWRITE yardım cümlesinin tam tersidir.</p>
<pre class="brush: sql">SELECT /*+ NOREWRITE */ horse_name, owner, position, COUNT(*)

FROM results

GROUP BY horse_name, owner, position
</pre>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong>ORDERED</strong></p>
<p>Optimizerin FROM kalıbındaki tabloları belirtilen sırada (soldan sağa) birleştirmesini sağlar. Raporlama</p>
<p>ortamlarında bu yardım cümleciği çok yardımcı olabilir. Ne kadar çok tablo belirtilmişse bu yardım</p>
<p>cümleciğinin faydası da o kadar artar. Aşağıda bir örneği görülebilir:</p>
<pre class="brush: sql">SELECT /*+ ORDERED */ acct_name, trans_date, amount, dept, address

FROM trans t, account a, category c, branch b, zip z

WHERE t.trans_date &gt; sysdate - 30

AND a.zip = z.zip

AND z.state = 'WA'

AND t.account between 700000 and 799999

AND t.account = a.account

AND a.account = 'ACTIVE'

AND a.category = c.category

AND c.catgory = 'RETAIL'

AND t.branch_id = b.branch_id

AND b.branch = 'BELLEVUE'
</pre>
<p>Genel olarak bir sorguyu belirleyen asıl tablonun hangisi olacağı indeksin tipine, indeksteki kolonların</p>
<p>sayısına ve indeksteki kayıt sayısına bağlıdır. Örneğin, WHERE kalıbında eşitlik bulunan bir kolon</p>
<p>üzerinde UNIQUE indeksi bulunan tablo, NON-UNIQUE indeksli ve eşitlikli bir tabloya göre öncelik</p>
<p>kazanır.</p>
<p><strong>RULE</strong></p>
<p>Belirtilen komut için “Rule-based” optimizasyon yapar. INIT.ORA’daki OPTIMIZER_MODE Oracle</p>
<p>parametresinin CHOOSE olarak ayarlanması ve tablo istatistiklerinin toplatılmaması da aynı işi görür.</p>
<p><strong>UNNEST</strong></p>
<p>İç içe sorgularda, alt sorgunun ana sorguyla birleştirilmesini ve optimizerin daha doğru karar vermesini</p>
<p>sağlar. UNNEST sadece UNNEST_SUBQUERY=TRUE olarak Oracle parametresinin ayarlanmasıyla</p>
<p>kullanılabilir.</p>
<pre class="brush: sql">SELECT /*+ UNNEST */ count(*)

FROM horses

WHERE horse_name LIKE 'M%'

AND horse_name NOT IN

( SELECT horse_name

FROM horse_owners

WHERE owner LIKE '%Lombardo%');
</pre>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong>USE_CONCAT</strong></p>
<p>Optimizerin WHERE koşulundaki OR şartlarını UNION ALL şekline dönüştürmesini sağlar. Aşağıdaki</p>
<p>örnekte, indeks, OR koşulunun iki tarafı için iki kez taranmaktadır. Gelen veriler ise daha sonra tek</p>
<p>sonuç çıktısı için birleştirilmektedir.</p>
<p>SELECT /*+ USE_CONCAT */ COUNT(*)</p>
<p>FROM horse_owners</p>
<p>WHERE identifier &lt; 10 OR identifier &gt; 20</p>
<p><strong>Kaynaklar ve daha fazlası için </strong></p>
<p>Oracle® Database Performance Tuning Guide</p>
<p>http://download-uk.oracle.com/docs/cd/B19306_01/server.102/b14211/sql_1016.htm</p>
<p>Oracle Enterprise Manager Database Tuning with the Oracle Tuning Pack</p>
<p>http://download-east.oracle.com/docs/html/A86647_01/toc.htm</p>
<p>Oracle Documentation</p>
<p>http://www.stanford.edu/dept/itss/docs/oracle/10g/nav/portal_3.htm</p>
<p>Oracle Technologies Sites (Articles, sample codes, blogs, tutorials etc.)</p>
<p><a href="http://www.oracle.com/technology/tech/index.html">http://www.oracle.com/technology/tech/index.html</a></p>
<p><strong>SQL Tuning El Kitabı call 7/24</strong></p>
<p><cite>www.keskul.com/<strong>SQLTuning</strong>.pdf</cite><em> </em></p>
<p>Oracle Ask Tom Forum</p>
<p>http://asktom.oracle.com/</p>
<p>Practical SQL: Tuning Queries</p>
<p>http://www.informit.com/articles/article.asp?p=27015&#038;rl=1</p>
<p>Oracle FAQ Support</p>
<p>http://www.orafaq.com/search/SQL+TUNE</p>
<p>Hayrullah AYAN</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ceturk.com/oracle-veritabanina-kusbakisi-%e2%80%93-sql-tuning-%e2%80%93-9-ve-10-ders/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle Veritabanına Kuşbakışı – 8.Ders</title>
		<link>http://www.ceturk.com/oracle-veritabanina-kusbakisi-ders-8/</link>
		<comments>http://www.ceturk.com/oracle-veritabanina-kusbakisi-ders-8/#comments</comments>
		<pubDate>Fri, 05 Mar 2010 23:55:27 +0000</pubDate>
		<dc:creator>hayrullah ayan</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Veri Tabanı]]></category>
		<category><![CDATA[Hayrullah Ayan]]></category>
		<category><![CDATA[oracle procedure]]></category>
		<category><![CDATA[Oracle Veritabanına Kuşbakışı Ders Serisi]]></category>
		<category><![CDATA[pl sql]]></category>
		<category><![CDATA[pl sql prosedür]]></category>

		<guid isPermaLink="false">http://www.ceturk.com/?p=5296</guid>
		<description><![CDATA[PL/SQL PROSEDÜRLERİ Prosedürler belirli işlemleri gerçekleştirmek üzere oluşturulan özel bloklardır. PL/SQL’de prosedürler diğer programlama dillerinden biraz farklı olarak birden fazla değer döndürebilirler. PROCEDURE isim [(parametre[, parametre, ...])] IS [yerel tanımlamalar] BEGIN komutlar [EXCEPTION hata durumları] END [isim]; parametre_adı [IN &#124; OUT [NOCOPY] &#124; IN OUT [NOCOPY]] veritipi [{:= &#124; DEFAULT} açıklama] Bir prosedürün iki kısmı [...]]]></description>
			<content:encoded><![CDATA[<h2>PL/SQL PROSEDÜRLERİ</h2>
<p>Prosedürler belirli işlemleri gerçekleştirmek üzere oluşturulan özel bloklardır. PL/SQL’de prosedürler diğer programlama dillerinden biraz farklı olarak birden fazla değer döndürebilirler.<span id="more-5296"></span></p>
<pre class="brush:csharp">PROCEDURE isim [(parametre[, parametre, ...])] IS

[yerel tanımlamalar]

BEGIN

komutlar

[EXCEPTION

hata durumları]

END [isim];

parametre_adı [IN | OUT [NOCOPY] | IN OUT [NOCOPY]] veritipi

[{:= | DEFAULT} açıklama]</pre>
<p>Bir prosedürün iki kısmı vardır: tanımlama ve gövde. Tanımlama kısmı <code>PROCEDURE kelimesi ile başlar ve prosedür adı ya da parametre listesi ile biter. Parametre tanımlamaları zorunlu değildir. Parametre kullanılmayan prosedürler parantez kullanmadan yazılabilirler.</code></p>
<p><code> Prosedürün gövde kısmı IS anahtar kelimesi ile başlar ve END anahtar kelimesi ile biter. Prosedürün gövdesi de üç kısma ayrılır: değişkenlerin tanımlandığı kısım, komut cümlelerinin yazıldığı kısım ve hata durumlarının kontrol edildiği kısım. Değişken tanımlama kısmı IS kelimesinden hemen sonra başlar. Burada DECLARE kelimesi kullanılmaz. Komut cümlelerinin yazıldığı kısım ise BEGIN anahtar kelimesi ile başlar ve EXCEPTION ya da END ile biter. Bu kısımda en az bir komut yazılmalıdır. Hata durumları kısmı zorunlu değildir. Prosedür END kelimesi ile son bulur. Bu anahtar kelimenin yanına prosedür ismi yazılabilir, zorunlu değildir.</code></p>
<p><code> Aşağıdaki maas_artir prosedürü bir işçinin maaşının verilen miktar kadar artırılmasını sağlar:</code></p>
<pre class="brush:csharp">PROCEDURE maas_artir (isci_no INTEGER, miktar REAL) IS

gecerli_ucret REAL;

ucret_yok EXCEPTION;

BEGIN

SELECT ucret INTO gecerli_ucret FROM isci

WHERE iscino = isci_no;

IF gecerli_ucret IS NULL THEN

RAISE ucret_yok;

ELSE

UPDATE isci SET ucret = ucret + miktar

WHERE iscino = isci_no;

END IF;

EXCEPTION

WHEN NO_DATA_FOUND THEN

print 'Yanlış İşçi Numarası'

WHEN ucret_yok THEN

print 'Geçerli Maaş Miktarı Yok');

END maas_artir;</pre>
<p>Bu prosedür bir başka blok içerisinden şöyle çağırılabilir:</p>
<pre class="brush:csharp">DECLARE

isci_no NUMBER;

miktar REAL;

BEGIN

...

maas_artir(isci_no, miktar);</pre>
<h2>PL/SQL Fonksiyonları</h2>
<p>Bir fonksiyon bir değer hesaplayan alt programdır. Fonksiyon ve prosedür yapıları RETURN anahtar kelimesi haricinde benzerdir. Fonksiyonlar şöyle yazılabilirler:</p>
<pre class="brush:csharp">FUNCTION isim [(parametre[, parametre, ...])] RETURN veri_tipi IS

[yerel tanımlamalar]

BEGIN

Komut cümleleri

[EXCEPTION

Hata durumları]

END [isim];

Parametre listesi şu düzende verilebilir:

parametre_ismi [IN | OUT [NOCOPY] | IN OUT [NOCOPY]] veri_tipi

[{:= | DEFAULT} açıklama]</pre>
<p>Yukarıda prosedürler için anlatılan yapı kısmı fonksiyonlar içinde geçerlidir. Fark olarak burada fonksiyon tek bir değer döndürür ve bu değerin tipi RETURN anahtar kelimesinde sonra yazılır.</p>
<p>Aşağıdaki fonksiyon bir maaş miktarının istenen dereceye ait olup olmadığını bulur:</p>
<pre class="brush:csharp">FUNCTION maas_ok (maas REAL, ucret_derece INTEGER) RETURN BOOLEAN IS

min_ucret REAL;

max_ucret REAL;

BEGIN

SELECT endusuc, enyukuc INTO min_ucret, max_ucret

FROM ucretoran

WHERE derece = ucret_derece;

RETURN (maas &gt;= min_ucret) AND (maas &lt;= max_ucret);

END maas_ok;</pre>
<p>Bu fonksiyon bir başka blok içerisinden şöyle çağrılabilir:</p>
<pre class="brush:csharp">DECLARE

yeni_ucret REAL;

yeni_derece NUMBER(5);

BEGIN

...

IF maas_ok(yeni_ucret, yeni_derece) THEN ...</pre>
<h2>Kayıtlı Alt Programlar</h2>
<p>Bir PL/SQL alt programını Oracle’ın tüm diğer ürünlerinde de kullanmak istiyorsak bu alt programı veritabanına kaydedebiliriz. Alt programları Oracle veritabanına kalıcı olarak kaydetmek için <code>CREATE</code> <code>PROCEDURE</code> ve <code>CREATE</code> <code>FUNCTION komutları kullanılır.</code></p>
<h2>Parametre Modları</h2>
<p>Yukarıda fonksiyon ve prosedürler anlatılırken bunlara parametreler geçirilebileceği söylenmişti. Bir alt programa parametreler üç farklı modda geçirilebilir. Bunlar IN, OUT, IN OUT olarak adlandırılır. Bu üç mod her alt programda kullanılabilir. Fakat OUT ve IN OUT modlarının fonksiyonlarda kullanılmaması önerilir. Çünkü bir fonksiyonun amacı sıfır, bir  ya da daha çok parametre alıp sonuçta tek bir değer göndermektir.</p>
<p>IN modunda alt programa geçirilen bir parametre bir sabit gibi davranır. Yani alt program içerisinde bu parametrenin değeri alınıp başka bir değişkene aktarılabilir, fakat değiştirilemez. Eğer parametre geçirirken hiçbir mod belirtilmezse, parametreler otomatik olarak IN modunda kabul edilir. IN modunda gönderilen parametre bir sabit, string, değişken ve matematiksel bir işlem olabilir.</p>
<p>OUT modunda gönderilen bir parametre alt program içerisinde bir değişken gibi davranır. Paramterenin değeri alnıbilir ve değiştirilebilir. Bu tip bir parametre mutlaka bir değişken olmalıdır. Yani bir sabit ya da matematiksel bir işlem bu modda gönderilemez. Burada alt programa gönderilen parametrenin değeri, alt programa geçtiği anda NULL değer olur. Bu yüzden alt programa OUT modunda gönderilecek bir parametre tanımlanırken NOT NULL kısıtlamasının getirilmemiş olmasına dikkat edilmelidir. Alt program bittikten sonra, alt program içerisinde değer atanmış olan OUT modu parametreleri bu değerlerini korurlar. Yani girişte NULL değer alıp çıkışta değerlerini korurlar.</p>
<p>IN OUT modunda gönderilen parametreler diğer iki modun yaptığını birleştirirler. Yani bir parametre bir ilk değer ile alt programa girer, alt program içerisinde bu değeri değişebilir ve değerini kaybetmeden alt programdan çıkar. IN OUT modunda gönderilen bir parametre bir değişken olmalıdır, sabit, string ya da matematiksel bir işlem olamaz.</p>
<h2>PL/SQL Paketleri</h2>
<p>Oracle’da paket olarak adlandırılan nesneler, birbiriyle ilişkili fonksiyon ve prosedürlerin bir isim altında gruplanmasıyla oluşturulur. PL/SQL paketleri sayesinde daha modüler programlar geliştirilebilir. Birden fazla uygulama tarafından kullanılan bir paket üzerinde değişiklik yapılarak, tüm bu uygulamaların güncellenmesi sağlanabilir. Bir paket içerisindeki bir alt program çağrıldığında, tüm paket belleğe alınır ve bu paketle ilişkili diğer alt programlar bu sayede hızlı çalıştırılabilir.</p>
<p>Bir paket tanımlama ve gövde kısımlarından oluşur. Tanımlama kısmı bir ara yüz gibidir. Veri tipleri, sabitleri hata durumları, imleçler ve alt programlar burada tanımlanır. Paket gövdesinde ise imleçlerin ve alt programların işlem satırları yer alır.</p>
<p>Aşağıda Oracle yardım dokümanları içerisinde verilmiş bir şema yer almaktadır. Burada anlatılmak istenen “kara kutu” olarak verilen gövde kısmında rahatlıkla değişiklik yapılabileceğidir. Tanımlamalar “specification” kısmında yer aldığına göre gövdede yapılan değişikliklerden uygulama programı etkilenmeyecektir.</p>
<p>Bir paket oluşturmak için <code>CREATE</code> <code>PACKAGE</code> komutu kullanılır:</p>
<pre class="brush:csharp">CREATE [OR REPLACE] PACKAGE paket_ismi

[AUTHID {CURRENT_USER | DEFINER}] {IS | AS}

[tip_tanımı [tip_tanımı] ...]

[imleç_tanımı [imleç_tanımı] ...]

[{altprog_tanımı | çağrı_tanımı}[{altprog_tan | çağrı_tan}]...]

END [paket_ismi];

[CREATE [OR REPLACE] PACKAGE BODY paket_ismi {IS | AS}

[tip_tanımı [tip_tanımı] ...]

[imleç_gövdesi [imleç_gövdesi] ...]

[{altprog_tanımı | çağrı_tanımı} [{altprog_tan | çağrı_tan}]...]

[BEGIN

komut_cümleleri]

END [paket_ismi];]</pre>
<p>Tanımlama kısmı genel tanımlamaları içerir ve uygulama programları tarafından görülür. Gövde kısmı ise program kodlarını, ayrıntıları ve özel tanımlamaları içerir. Uygulama programları buraya erişemez. Gövde de değişiklik yapıldığında uygulama programlarının yeniden derlenmesi gerekmez. Burada AUTHID kısmı paketi oluşturan kullanıcın adıdır.</p>
<pre class="brush:csharp">CREATE OR REPLACE PACKAGE isci_islem AS  -- tanımlama

TYPE IsKayTip IS RECORD (isci_no INTEGER, ucret REAL);

CURSOR ucret_liste RETURN IsKayTip;

PROCEDURE isci_kayit (

İscino   NUMBER

isciadi  VARCHAR2,

isi              VARCHAR2,

muduru       NUMBER,

ucret          NUMBER,

bolum         NUMBER);

PROCEDURE isci_sil (isci_no NUMBER);

END isci_islem;

CREATE OR REPLACE PACKAGE BODY isci_islem AS  -- gövde

CURSOR ucret_liste RETURN IsKayTip IS

SELECT iscino, ucret FROM isci ORDER BY ucret DESC;

PROCEDURE isci_kayit (

İscino   NUMBER,

isciadi  VARCHAR2,

isi      VARCHAR2,

muduru   NUMBER,

ucret    NUMBER,

bolum    NUMBER) IS

BEGIN

INSERT INTO isci VALUES (iscino, isciadi, isi,

muduru, SYSDATE, ucret, bolum);

END isci_kayit;

PROCEDURE isci_sil (isci_no NUMBER) IS

BEGIN

DELETE FROM isci WHERE iscino = isci_no;

END isci_sil;

END isci_islem;</pre>
<h2>PL/SQL Tetiklemeleri</h2>
<p>Tetiklemeler(PL/SQL Triggers) tıpkı prosedürler gibi veritabanına kaydedilir, fakat program kodu içerisinde çağrılarak işletilmezler. Tetiklemeler veritabanı tarafından otomatik olarak başlatılırlar. Tetiklemeleri başlatan bazı olaylar vardır. Bu olaylar INSERT, UPDATE, DELETE gibi veri işleme dili komutları, veri tanımlama dili komutları, veri tabanı açma-kapama işlemleri, bir kullanıcnın bağlanma ya da bağlantı kesme işlemleri gibi olaylardır. Bir tetikleme prosedürü üç bölümden oluşur:</p>
<ul>
<li>Tetikleme olayı ya da komutu</li>
<li>Tetikleme kısıtlaması</li>
<li>Tetikleme işlem bölümü</li>
</ul>
<p>Tetiklemelerin oluşturulmasını göstermek için bir örnek yapalım. “isci” tablomuzdaki herhangi bir işçinin maaşı arttığında maaşı 1000’i geçenleri başka bir tabloya kaydeden bir tetiklme yazalım. Burada işleme maaş artıktan sonra başlayacağız. Bu yüzden AFTER UPDATE kullanıyoruz. Tetiklemelerin bu kısmına AFTER ve BEFORE gibi kelimeler yazılır. AFTER INSERT OR UPDATE gibi iki olayı kapsayan şartlarda yazılabilir. Buraya ON DATABASE SHUTDOWN gibi sistem olaylarıda yazılabilir.</p>
<pre class="brush:csharp">CREATE OR REPLACE TRIGGER maas_artisi

AFTER UPDATE ON isci

FOR EACH ROW

WHEN (new.ucret &gt; 1000)

BEGIN

INSERT INTO isci_log (isci_no, artis_tarihi, yeni_ucret)

VALUES (:new.iscino, SYSDATE, :new.ucret );

END;</pre>
<p>Hayrullah AYAN</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ceturk.com/oracle-veritabanina-kusbakisi-ders-8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<enclosure url="http://www.ceturk.com/images/oracle-logo7.gif" length="5831" type="image/jpg" />	</item>
		<item>
		<title>Oracle Veritabanına Kuşbakışı – 7.Ders</title>
		<link>http://www.ceturk.com/oracle-veritabanina-kusbakisi-ders-7/</link>
		<comments>http://www.ceturk.com/oracle-veritabanina-kusbakisi-ders-7/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 22:52:14 +0000</pubDate>
		<dc:creator>hayrullah ayan</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Veri Tabanı]]></category>
		<category><![CDATA[Hayrullah Ayan]]></category>
		<category><![CDATA[oracle loop]]></category>
		<category><![CDATA[oracle plsql]]></category>
		<category><![CDATA[Oracle Veritabanına Kuşbakışı Ders Serisi]]></category>
		<category><![CDATA[pl sql blok]]></category>
		<category><![CDATA[plsql if yapısı]]></category>

		<guid isPermaLink="false">http://www.ceturk.com/?p=5294</guid>
		<description><![CDATA[Oracle ürünleri başlıklı kısımda genel bilgi olarak anlattığımız PL/SQL’in burada ayrıntılarına ineceğiz. PL/SQL Bloklarının Yapısı PL/SQL blok yapılı bir dildir. Her bir blok bir program ünitesini oluşturur. Pl/SQL blokları prosedür, fonksiyon ve normal blok olarak üçe ayrılır. Prosedür ve fonksiyon yapısı ileride ele ele alınmıştır. Şimdi burada normal bir blok yapısı işlenecektir. Bir PL/SQL bloğu [...]]]></description>
			<content:encoded><![CDATA[<p>Oracle ürünleri başlıklı kısımda genel bilgi olarak anlattığımız PL/SQL’in burada ayrıntılarına ineceğiz.</p>
<h2>PL/SQL Bloklarının Yapısı</h2>
<p>PL/SQL blok yapılı bir dildir. Her bir blok bir program ünitesini oluşturur. Pl/SQL blokları prosedür, fonksiyon ve normal blok olarak üçe ayrılır. Prosedür ve fonksiyon yapısı ileride ele ele alınmıştır. Şimdi burada normal bir blok yapısı işlenecektir. Bir PL/SQL bloğu seçimlik bir tanımlama bölümü, PL/SQL cümlelerinin yazıldığı bir bölüm ve hata yakalama bölümünden oluşur. Bloklara isim vermek zorunlu değildir. Eğer hazırlanan bir blok yeniden kullanılmak istiyorsa .sql uzantılı dosyalara saklanıp yeniden kullanılabilir.<span id="more-5294"></span></p>
<p>* “[“ ve “]” işaretleri arasındaki alanların yazılması zorunlu değildir.</p>
<pre class="brush:csharp">[&lt;blok  başlığı&gt;]

[DECLARE

&lt;sabitler&gt;

&lt;değişkenler&gt;

&lt;imleçler&gt;

&lt;kullanıcı tanımlı hata yakalama isimleri&gt;]

BEGIN

&lt;PL/SQL komutları&gt;

[ EXCEPTION

&lt;hata durumu komutları&gt;]

END;</pre>
<p>Blok başlığı PL/SQL bloğunun prosedür, fonksiyon veya bir paket bloğu olup olmadığını belirler. Eğer bir başlık tanımlanmazsa bu isimsiz blok(anonymous) olarak adlandırılır. “Declare” kısmı diğer programlama dillerinde olduğu gibi değişken ve sabitlerin tanımlandığı kısımdır.</p>
<p>PL/SQL blokları içerisinde kullanılan tüm sabitler, değişkenler, imleçler ve kullanıcı tanımlı hata durumları “declare” kısmında tanımlanmalıdır. Burada sabit ve değişkenler şöyle tanımlanabilir:</p>
<pre class="brush:csharp">&lt;değişken adı&gt; [constant] &lt;veri tipi&gt; [not null] [:= &lt;ilk değer&gt;];</pre>
<p>SQL’de kullanılan tüm veri tipleri(SQL bölümünde anlatılmıştı) ve Boolean veri tipi burada kullanılabilir. Boolean tipte bir değişken “true”, “false” ve “null” değerlerini alabilir. “not null” yan cümlesi değişkenin mutlaka bir değer alması gerektiğini bildirir. Burada tanımlanan değişkenlere “:=” operatörü ile ilk değer atanabilir. Eğer bir ilk değer atanmazsa değişkenlerin alacağı ilk değer “null” ‘dur. Eğer “constant” ile tanımlama yapılırsa değişkenin değeri değiştirilemez.</p>
<pre class="brush:csharp">
<pre>DECLARE</pre>
<p>isbastar                         date;                           /* ilk değeri “null” */<br />
isi                     varchar2(80) := 'tezgahtar';<br />
isci_bulundu      boolean;                                   /* ilk değeri “null” */<br />
maas_artisi       constant number(3,2) := 1.5;      /* sabit */<br />
BEGIN ... END;</pre>
<p>Tanımlama kısmında değişkenlere bir veri tipi vermek yerine bir tablodaki bir alanın veri tipi değişkene aktarılabilir. Örneğin “isci.iscino%TYPE” şeklinde bir tanımlama ilgili değişkenin “isci” tablosundaki “iscino” değişkeni ile aynı veri tipinde olmasını sağlar. Tek bir değişken için tablonun bir alanının veri tipini almak yerine tablonun tüm alanlarının veri tipleri bir değişkene aktarılabilir. Örneğin “isci%ROWTYPE” ile istenen değişkene tablonun yapısı aynen aktarılabilir. Buna tıpkı Pascal’daki gibi “record” veri tipi denir. Burada eğer “tablo isci%ROWTYPE” şeklinde bir tanımlama yapılırsa tablo.iscino ya da tablo.isciadi şeklinde değişkenler kullanılabilir. Bu tür bir tanımlama imleç kullanırken kolaylık sağlar.</p>
<p>PL/SQL blokları içerisinde gerçekleştirilecek işlemler begin..end kelimeleri arasına yazılır. Burada dikkat edilmesi gereken bir husus vardır: PL/SQL blokları içerisinde veri tanımlama dili komutları(yani Create Table, Alter TableSpace, Drop User gibi) ve veri kontrol dili komutları(grant ve revoke gibi) kullanılamaz. Pl/SQL blokları içerisinde veri işleme dili komutları kullanılabilir. (Select, Update, Delete, Insert gibi) .</p>
<p>Hata durumları ya da aykırı durumlar olarak adlandırılan “exceptions” kısmında PL/SQL blokları arasında gerçekleşen bazı hataları kullanıcıya yansıtmadan kontrol etme ve gerekli işlemleri yapma olanağı vardır. Oracle tarafından tanımlanmış hata durumları olduğu gibi programcılar da hata durumları tanımlayabilirler.</p>
<h2>PL/SQL Akış Kontrolü</h2>
<p>Pl/SQL blokları içerisinde kosullu-koşulsuz dallanmalar ve döngüler kullanılabilir. Bu amaçla kullanılan yapıları burada inceleyeceğiz. PL/SQL’de iki tip kontrol yapısı vardır. Brincisi “IF” kontrol yapısı ve diğer “LOOP “ kontrol yapısı.</p>
<h3>IF Kontrol Yapısı</h3>
<p>PL/SQL içerisinde üç tip “IF” yapısı kullanılır:</p>
<p>1-) IF şart THEN                                    2-)IF şart THEN                                        3-)IF şart THEN</p>
<p>Komutlar                                  komutlar                                              komutlar</p>
<p>END IF                                ELSE                                                         ELSEIF şart</p>
<p>Şartın gerçekleşmemesi                                    komutlar</p>
<p>halindeki komutlar                            ENDIF</p>
<p>END IF</p>
<h3>LOOP Kontrol Yapısı</h3>
<p>PL/SQL içerisinde temel LOOP, FOR ve WHILE döngüleri vardır.</p>
<pre class="brush:csharp">LOOP

Komut1

.....

KomutN

GOTO etiket adı

EXIT [WHEN şart]

END LOOP

FOR sayac IN [REVERSE] başlangıç..bitiş

LOOP

Komut1

...

KomutN

EXIT [WHEN şart]

END LOOP

WHILE şart LOOP

Komut1

...

KomutN

END LOOP</pre>
<h2>İmleçler</h2>
<p>Birden fazla kaydın hafızaya getirilme işlemlerine imleç(cursor) açma denir. İmleç açma, özellikle veritabanındaki tablolardan kayıtların teker teker getirilmesinde faydalı olmaktadır. Kayıtlar teker teker getirilerek üzerinde işlemler yapılıp tekrar veritabanına kaydedilebilmektedir. Oracle, hafızada bu tip işlemleri yapabilmek için yer ayırmaktadır. İki çeşit imleç vardır:</p>
<p><strong>Kapalı İmleçler(Implicit Cursors):</strong> Yazılan her SELECT, INSERT, UPDATE ve DELETE komutları için veritabanı tarafından otomatik olarak açılan imleçlerdir. Yazılan her SQL için, SQL’in yazım kontrollerini yapmak ve SQL&#8217;i çalıştırmak için hafızadan bir yer ayrılır. Bu ayrılan yer için standart olarak tanımlanan imlece kapalı imleç denir.PL/SQL blokları arasında yazılan SQL komutları için, tanımlanan kapalı imlece ait özellikler geçerli olmaktadır. Yazılan her SQL için tanımlanan kapalı imleçlerin şu özellikleri kullanıma açıktır:</p>
<p>SQL%ISOPEN : SQL sonucu eğer imleç açık ise “true” değeri, kapalı ise “false” değeri döndürür.</p>
<p>SQL%ROWCOUNT : SQL cümlesi tarafında işlem gören kayıt sayısnı görüntüler.</p>
<p>SQL%FOUND : SQL sonucu en az bir kayıt işlem görmüşse “true”, hiç kayıt işlem görmemişse “false” döndürür.</p>
<p>SQL%NOTFOUND : SQL sonucu eğer hiçbir kayıt işlem görmemişse “true”, en az bir kayıt işlem görmüşse “false” değeri dödürür.</p>
<pre class="brush:csharp">DECLARE

Silinen_kayit_sayisi       number(5);

BEGIN

delete from isci

where bolum=10;

silinen_kayit_sayisi:=SQL%ROWCOUNT;

END;

DECLARE

delete from isci

where bolum=10;

if SQL%FOUND then

commit;

else

rollback;

END;</pre>
<p><strong>Açık İmleçler(Explicit Cursor):</strong> Kullanıcı tarafından belirli bir işi yapabilmek için açılan imleçlerdir. Özellikle fazla sayıda kayıtların bulunduğu tablolarda, silme, güncelleme ve benzer işlemlerde çok kullanışlı program parçalarıdır.</p>
<pre class="brush:csharp">DECLARE

CURSOR &lt;imleç adı&gt; [(&lt;parametre listesi&gt;)] IS

SQL cümlesi

Kayıt_tipi_değişkeni      &lt;imleç adı&gt;%ROWTYPE

Değişken_1       NUMBER;

Değişken_2       NUMBER;

BEGIN

OPEN &lt;imleç adı&gt;

LOOP

FETCH &lt;imleç adı&gt; INTO kayıt_tipdeğişkeni;

EXIT WHEN &lt;imleç adı&gt;%NOTFOUND;

........

komutlar;

END LOOP;

CLOSE &lt;imleç adı&gt;;

END;</pre>
<p>Burada imleç adı PL/SQL blokları içerisinde başka bir değişken adı olarak kullanılıyor olmamalıdır. Parametreler “&lt;parametre adı&gt; &lt;veri tipi&gt;” şeklinde bildirilmelidir. PL/SQL içerisinde kullanılan tüm veri tipleri parametreler için kullanılabilir.(char, varchar2, number, date, boolean ya da number veri tipinin integer, real gibi alt veri tipleri). Aşağıda farklı şekillerde açılmış imleç örnekleri verilmiştir:</p>
<pre class="brush:csharp">CURSOR c1 IS SELECT iscino, isciadi, isi, ucret FROM isci WHERE ucret &gt; 2000;

CURSOR c2 RETURN bolum%ROWTYPE IS  SELECT * FROM bolum WHERE bolumno = 10;

CURSOR c3 (verilen_tarih DATE) IS

SELECT iscino, ucret FROM isci WHERE isbastar &gt; verilen_tarih;</pre>
<p>Eğer bir imleç açıldığında kayıtlar üzerinde değişiklik yapılacaksa, imleç tanımından sonra “for update[(&lt;sütun(lar)&gt;)]” şeklinde tanımlama yapılmalıdır. Böyle bir tanımlama yapıldığında imleç içerisindeki kayıtlar kilitlenir ve “commit” komutu uygulanana kadar diğer kullanıcılar bu kayıtlara erişemez.</p>
<h3>Hata Durumları</h3>
<p>Hata durumları normalin haricindeki durumlarda nelerin yapılacağının tanımlandığı bölümdür. Belirtilen özel durum oluştuğunda Oracle, PL/SQL komutlarını çalıştırmaya devam etmemekte, onun yerine o özel durumda yapılması tanımlanan işlemleri yapmaya çalışmaktadır. Hata durumları iki türlüdür: Oracle tarafından önceden tanımlanmış hata durumları ve kullanıcı tanımlı hata durumları.</p>
<pre class="brush:csharp">EXCEPTION

WHEN  &lt;önceden tanımlanmış hata durumu&gt; THEN

Komutlar</pre>
<p>Oracle tarafından tanımlı çok kullanılan hata durumları:</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="216" valign="top">DUP_VAL_ON_INDEX</td>
<td width="341" valign="top">Tekil olması gereken bir alana   bu durumu ihlal eden bir kayıt eklenmeye çalışıldığında ortaya çıkar.</td>
</tr>
<tr>
<td width="216" valign="top">INVLAID_CURSOR</td>
<td width="341" valign="top">“OPEN” komutu ile açılmamış bir   imleç ile işlem yapılmaya çalışıldığında ortaya çıkar.</td>
</tr>
<tr>
<td width="216" valign="top">INVALID_NUMBER</td>
<td width="341" valign="top">Değişkenin tanımından daha büyük   bir sayı değişkene atanmak istendiğinde ortaya çıkar.</td>
</tr>
<tr>
<td width="216" valign="top">NO_DATA_FOUND</td>
<td width="341" valign="top">SQL sonucu kayıt dönmediği zaman   ortaya çıkar.</td>
</tr>
<tr>
<td width="216" valign="top">ZERO_DIVIDE</td>
<td width="341" valign="top">Sıfıra bölme işleminde ortaya   çıkan durumdur.</td>
</tr>
<tr>
<td width="216" valign="top">TOO_MANY_ROWS</td>
<td width="341" valign="top">Bir kayıt dönmesi gereken SQL   ‘den birden fazla kayıt döndüğünde ortaya çıkan durumdur.</td>
</tr>
<tr>
<td width="216" valign="top">VALUE_ERROR</td>
<td width="341" valign="top">Numerik veya karakter tipli bir   değişkenin diğerinin yerine kullanılmaya çalışıldığı durumdur.</td>
</tr>
<tr>
<td width="216" valign="top">CURSOR_ALREADY_OPEN</td>
<td width="341" valign="top">Açık bir imlecin tekrar açılmaya   çalışıldığı durumdur.</td>
</tr>
<tr>
<td width="216" valign="top">LOGIN_DENIED</td>
<td width="341" valign="top">Veritabanına yanlı kullanıcı adı   ve şifre ile bağlanılmaya çalışıldığı durumdur.</td>
</tr>
<tr>
<td width="216" valign="top">NOT_LOGGED_ON</td>
<td width="341" valign="top">Veritabanına bağlanmadan SQL   cümlesi çalıştırıldığında ortaya çıkan durumdur.</td>
</tr>
<tr>
<td width="216" valign="top">OTHERS</td>
<td width="341" valign="top">EXCEPTION bölümünde yazılan hata   durumlarından hiç biri oluşan hatayla eşleşmediğinde  bu durum işleme girer.</td>
</tr>
</tbody>
</table>
<p>Kullanıcıların tanımladığı hata durumları da önceden tanımlı hata durumları ile benzerdir. Farklı olarak kullanıcı bir prosedür çağırıyormuş gibi bu hata durumlarını da çağırmalıdır. Çağırmak için “RAISE” komutu kullanılır.</p>
<pre class="brush:csharp">DECLARE

......

BEGIN

......

IF ucret&lt;2000 THEN

RAISE dusuk_maas;

END IF;

......

EXCEPTION

WHEN dusuk_maas THEN

Message(‘Düşük maaşlı işçi’);

END;</pre>
<p>Hayrullah AYAN</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ceturk.com/oracle-veritabanina-kusbakisi-ders-7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<enclosure url="http://www.ceturk.com/images/oracle-logo6.gif" length="5831" type="image/jpg" />	</item>
		<item>
		<title>Oracle Veritabanına Kuşbakışı – 6.Ders</title>
		<link>http://www.ceturk.com/oracle-veritabanina-kusbakisi-ders-6/</link>
		<comments>http://www.ceturk.com/oracle-veritabanina-kusbakisi-ders-6/#comments</comments>
		<pubDate>Fri, 22 Jan 2010 19:23:06 +0000</pubDate>
		<dc:creator>hayrullah ayan</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Veri Tabanı]]></category>
		<category><![CDATA[Hayrullah Ayan]]></category>
		<category><![CDATA[oracle dersleri]]></category>
		<category><![CDATA[oracle veri tipleri]]></category>
		<category><![CDATA[Oracle Veritabanına Kuşbakışı Ders Serisi]]></category>

		<guid isPermaLink="false">http://www.ceturk.com/?p=5292</guid>
		<description><![CDATA[SQL( STRUCTURED QUERY LANGUAGE ) Açılımı “Structured Query Language” yani “Yapısal Sorgulama Dili” olan SQL, veritabanı işlemleri ile ilgili komutlardan oluşan bir programlama dilidir. Burada veri tabanı işlemleri denilenler veritabanının kendisini oluşturmaktan, tablo, indeks, kullanıcı oluşturmak gibi veri tanımlama dili komutlarına ve kayıt ekleme, silme, düzeltme gibi veri işleme dili komutlarına kadar uzanır. Buradaki yapısal [...]]]></description>
			<content:encoded><![CDATA[<h1>SQL( STRUCTURED QUERY LANGUAGE )</h1>
<p><strong> </strong>Açılımı<strong> “</strong>Structured Query Language” yani “Yapısal Sorgulama Dili” olan SQL, veritabanı işlemleri ile ilgili komutlardan oluşan bir programlama dilidir. Burada veri tabanı işlemleri denilenler veritabanının kendisini oluşturmaktan, tablo, indeks, kullanıcı oluşturmak gibi veri tanımlama dili komutlarına ve kayıt ekleme, silme, düzeltme gibi veri işleme dili komutlarına kadar uzanır. Buradaki yapısal sözcüğü Pascal, C ve benzeri dillerdeki fonsiyon ve prosedür oluşturarak bir program yazmaktan biraz farklıdır. Yani kullanıcı SQL kullanırken fonksiyon ve prosedür yazmaz. SQL tarafından tanımlı komutları gerekli parametreleri vererek bir komut modu uygulamasındaymış gibi çalışır. Yine SQL kullanımında şartlı ifadeler ve dallanmalar yoktur. Yani kullanıcı Pascal, C vb. dillerdeki İf, Case gibi ifadeler kullanmaz. SQL’in akış kontrolü yapabilen bir modeli ISO/IEC tarafından kabul edilmiştir, fakat yaygın olarak kullanılmamaktadır. <span id="more-5292"></span>Oracle’ın geliştirdiği PL/SQL(Programming Language/SQL) işte bu prosedür, fonksiyon ve if,case,for..next gibi programlama için gereken işlemleri kullanmayı olanaklı kılar. Fakat PL/SQL sadece içerisinde SQL komutları kullanılabilen bir dildir. Yani SQL’in yapısını değiştirmemiştir. Komut modunda yazdığınız bir SQL cümlesini alıp PL/SQL blokları arasına yazabilirsiniz. Oracle sirketi geliştirdiği tüm uygulamalarda SQL kullanmayı esas alır. Kullanıcının Oracle ürünlerini kullanarak yaptığı tüm işlemlerin arkasında SQL komutları çalıştırılır. SQL’in veritabanı işlemleri için kullanılan komutları 5 kategoride toplanabilir:</p>
<ul>
<li>Veri sorgulama komutları</li>
<li>Tabloya veri ekleme,değiştirme ve silme      komutları</li>
<li>Veritabanı nesneleri oluşturma,değiştirme ve      silme komutları</li>
<li>Veritabanına ve veritabanı nesnelerine erişimi      kontrol etme komutları</li>
<li>Veritabanının tutarlılığını ve bütünlüğünü      koruma komutları</li>
</ul>
<p><strong>SQL’in Tarihi :</strong></p>
<p><strong> </strong>Dr. E.F. Codd ‘un “Communications of  The ACM(Association  of Computer Machinery)” adlı dergide 1970 Haziranında yayınladığı “A Reletional Model of Data for Large Shared Data Banks”(Büyük ve Paylaşımlı Veri Bankaları İçin İlişkisel Model) adlı makale bugün ilişkisel veri tabanı yönetim sistemleri(RDBMS) için kabul edilen model olmuştur. IBM şirketi Dr.Codd ‘un bu modelini kullanarak “Structured English Query Language (&#8220;SEQUEL&#8221;)” denilen bir dil geliştirmiştir. 1979 yılında o zamanki adı “Relational Software”  olan Oracle şirketi ticari olarak ilk defa SQL kullanmaya başlamıştır. Bugün SQL, ilişkisel veritabanı yönetim sistemlerinin  standart dili olarak kabul edilmektedir.</p>
<p><strong>Oracle’da Kullanılan Veri Tipleri:</strong></p>
<p><strong>CHAR(sayı): </strong>Sabit uzunluktaki alfasayısal verilerin tutulabildiği alanlar için kullanılır. Oracle 7 ve daha önceki sürümler için bu alanın uzunluğu en fazla 255 karakter olabilir. Oracle 8 ve sonrasında 2000 karakter uzunluğundadır. Eğer, sayı ile ifade edilen numaradan daha kısa uzunlukta veriler girilirse Oracle kaydın sonuna boşluk ekleyerek sabit uzunluğa kadar getirir. Örnek char(20).</p>
<p><strong>VARCHAR2(sayı): </strong>Değişken uzunluklu alfasayısal verilerin tutulduğu alanlar için kullanılır. Oracle 7 ve önceki sürümlerinde 2000 karakter, Oracle 8 ve sonraki sürümlerinde 4000 karakter uzunluğunda bilgi girilebilir. Örnek varchar2(30).</p>
<p><strong>NUMBER(n,p): </strong>Tamsayı ve Gerçel sayılar için kullanılan sayısal veri tipidir.Tam kısım en fazla 38 basamak olabilir. Ondalık kısmın basamak sayısı da –84 ile 127 arasında değişmektedir. Number veri tipinden türetilmiş int[eger], dec[imal], smallint ve real veri tipleri de kullanılabilmektedir.</p>
<p><strong>DATE: </strong>Tarih tutan alanlar için kullanılır. Bu tip alanlarda, tarih bilgileri ve saat bilgileri tutulabilir. Tarih formatları Oracle yüklerken seçtiğiniz dile göre değişir. Amerikan standartı için ‘DD-MON-YY’ dir. Yani bir tarih ’03-MAY-01’ şeklinde görünür. NLS_DATE_FORMAT parametresi ile tarih formatı değiştirilebilir. Tarihsel alanlar üzerinde aritmetiksel işlemler yapılabilir. Sistem tarihi SYSDATE fonksiyonu kullanılarak öğrenilebilir. Sayısal veya karakter olarak tanımlı bir alandaki veriler TO_DATE fonksiyonu ile tarih tipine çevrilebilir.</p>
<p><strong>LONG: </strong>2 GB ‘a kadar bilgi tutabilen karakter alanlar için kullanılır. Bir tabloda bu tipten ancak bir adet alan tanımlanabilir. Long veri tipine sahip alanlar için index oluşturulamaz.</p>
<p><strong>Not:</strong> Oracle’da boolean veri tipi yoktur. Bunun için char(1) ya da number(1) şeklinde tanımlama yapılıp kullanılabilir.</p>
<p><strong>Not: </strong>Bir tablonun alanları kendi veri tipine uygun değerler alabildiği gibi bir de NULL değer alabilirler. NULL değeri sayısal olarak 0’dan ve karakter olarak ta boş karakterden(‘ ‘) faklıdır.</p>
<p>SQL bölümünün bundan sonraki kısmında SQL komutları örnek tablolar üzerinde anlatılacaktır. Oracle veritabanı ilk yüklendiğinde bir “SCOTT” adlı kullanıcı oluşturulur ve bu kullanıcıya ait demo tablolar da oluşturulur. Bu kullanıcı ve tabloları tamamen deneme amaçlıdır. Biz de raporumuzda bu kullanıcının tablolarını Türkçe’ye çevirip kullanacağız. Rapora ek olarak verilen disketteki demobld.sql dosyası bu tabloları oluşturmak için gereken komutları içermektedir. Disketteki bu dosya SQL*Plus komut satırından çalıştırılmalıdır. Tabi ki bu işlemleri yapabilmek için Oracle 8i veritabanı önceden yüklenmiş olmalıdır. Aşağıda kullandığımız komutları bu tablolar üzerinde deneyebilirsiniz.</p>
<p>Bu amaçla öncelikle tablolarımız hakkında bilgiler verelim. Oluşturduğumuz tablolar bir iş yerindeki işçi kayıtlarını, bolum adlarını tutmak için kullanılan tablolardır. Birinci tablo “isci” tablosudur. Bu tablo <strong>iscino</strong>:number(4), <strong>isciadi</strong>:varchar2(10), <strong>isi</strong>:varchar2(9), <strong>muduru</strong>:number(4), <strong>isbastar</strong>:date, <strong>ucret:</strong>number(7,2), <strong>bolum:</strong>number(2) alanlarından oluşmaktadır. Tablo da isçilerin numarası, adı, görevi, işe başlama tarihi, aldığı ücret ve işçinin müdür kodu yer almaktadır.</p>
<p>İkinci tablo “bolum” tablosudur. “Bölüm” tablosu <strong>bolumno</strong>:number(2), <strong>bolumadi</strong>: varchar2(14), <strong>yer</strong>: varchar2(13) alanlarından oluşmaktadır. Bu tabloda işçilerin çalıştıkları bölüm kodları,bölüm adları ve bölümün bulunduğu il adı yer almaktadır.</p>
<p>Üçüncü tablo “ucretoran” tablosudur. Bu tabloda <strong>derece</strong>:number(5), <strong>endusuc</strong>:number(5), <strong>enyukuc</strong>:number(5) alanları yer almaktadır. Tablo işçilerin alabilecekleri kıdem numaralarını ve bu numara için en düşük ve en yüksek ücret miktarlarını göstermektedir.</p>
<p><strong>Sorgular</strong></p>
<p><strong> </strong>Veri tabanı içerisindeki tablolardan veri seçip listeleme ,kayıt ekleme, silme, değiştirme ile ilgili komutları bu başlık altında anlatacağız. Burada SQL ile ilgili olarak en çok kullanılan komut şekilleri anlatılmaya çalışılacaktır.</p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong>Bir tablonun yapısını görmek için <strong>DESC</strong>[IRIBE] komutu kullanılır.</p>
<p>Bir tablodan istenilen özellikteki verileri veri seçip listeleme için “SELECT” komutu kullanılır. Komutun yapısı:</p>
<pre class="brush:csharp">SELECT [ DISTINCT | ALL ] &lt;sütun(lar)&gt; FROM &lt;tablo adı&gt;

[ WHERE &lt;şart&gt; ]

[ GROUP BY &lt;sütunlar&gt;]

[ HAVING &lt; grup kısıtlaması&gt;]

[ ORDER BY &lt;sütun(lar) [ ASC | DESC ]&gt; ]
</pre>
<p><strong> </strong></p>
<p>İşi ‘tezgahtar’ olan ve aldığı maaş 900’den büyük olan işçi kayıtların listesi.</p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong>İşçi tablosunda adı ‘m’ ile başlayan kayıtların listesi.</p>
<p>Burada “_” alt tire işareti tek bir karaktere ve ‘%’ işareti birden fazla karaktere karşılık gelir. Birinci sorguda iki alt tire işareti kullanıldığında 3 adet kayıt listelenmiş, ikinci sorguda alt tire işareti üçe çıkarıldığında iki kayıt listelenmiştir. Çünkü ikinci sorguda istenen kayıtların isciadi alanının uzunluğu en az 5 karaktere çıkarılmış oluyor.</p>
<p><strong> </strong>İşçi tablosundan numarası ‘79’ ile başlayan kayıtların isciadi alanına göre tersten sıralanmış listesi. Burada to_char fonksiyonu iscino sayısal alanını karaktere çevirmek ve substr fonksiyonu da soldan ilk iki karakterini alıp karşılaştırma yapabilmek için kullanılmıştır.<strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong>Eğer tablodan listelenecek kaydın bir alanının içeriği tam olarak bilinmiyorsa ilgili kelimenin yakın telaffuzu yazılarak “soundex” fonksiyonu ile listeleme yapılabilir.</p>
<p><strong> </strong></p>
<p><strong> </strong>Months_between(tarih1,tarih2) fonksiyonu iki tarih arasındaki farkı ay olarak verir. Aşağıdaki sorgu komutu bunu gerçekleştirmektedir. Burada işleme sokarak elde ettiğimiz bir alana isim verme(bu örnekte FARK) işlemi de görülmektedir. Bu isim verme işlemi her alan için virgülden önce yapılabilir.</p>
<p><strong> </strong></p>
<p>COUNT(* | [ DISTINCT | ALL ] açıklama) fonksiyonu sorgu sonucu dönen kayıt miktarını göstermektedir. Eğer parametre olarak “*” girilirse tablodaki tüm kayıt sayısını verir. Parametre olarak bir sütun adı verilirse, o sütundaki içeriği NULL olmayan tüm kayıt sayısını verir.</p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p>“GROUP BY” yardımcı sözcüğü bir alana göre kayıtları guruplamak için kullanılır. Aşağıdaki örnekte isci tablosu içerisinde bir bölümde çalışan toplam kişi sayısı bulunuyor ve listelemede bolum alanı içerisindeki grup sayısı kadar kayıt yer alıyor. Yani bizim isci tablosunda 10,20,30 olmak üzere üç farklı bölüm numarası olduğundan 3 kayıt listeleniyor. Bölüm adı ve kodlarını tutan bölüm tablosunda toplam 4 adet kayıt olduğu, halde 40 nolu bölüm koduna sahip hiç bir işçi için “isci” tablosuna kayıt yapılmamış olduğu buradan anlaşılabilir.</p>
<p><strong> </strong></p>
<p>“HAVING” yardımcı sözcüğü “GROUP BY” yardımcı sözcüğü ile gruplanan kayıtlar üzerinde kısıtlama yapma işine yarar. Aşağıdaki örnekte isci tablosunda ikiden fazla kişi tarafından yapılan işlerin listesini veren komut gösterilmiştir.</p>
<p><strong> </strong></p>
<p>Bir işçinin adının ve çalıştığı yerin isminin(kodunun değil) listelenmesini istiyorsak, o işçinin çalıştığı yer kodunun adını bolum tablosundan getirmeliyiz. Bu tip işlemler “tablo birleştirme” işlemleri olarak adlandırılır. Verdiğimiz bu örneğe “eşit birleştirme” denir. Eşit birleştirme işlemlerinde bir tablodaki değere, diğer tabloda da mutlaka bir değer karşılık gelir ve “=” operatörü eşit birleştirme işlemlerinde kullanılır.</p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong>Bu örnek her bir bölümde belli bir işi yapanların ortalama maaş miktarlarının listesini verir. Örneğin satış bölümünde satış görevlisi olanların aldıkları maaşların ortalaması. Buna göre satış bölümünde 3 kişi varmış ve bunların maaşlarının ortalaması 1450.</p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p>Birleştirme işlemlerinde “eşit olmayan birleştirme” de vardır. Buna göre bir tabloda ki bir değer diğer tablodaki iki değer arasında yer almaktadır. Örneğin aşağıdaki örnek isci tablosundaki işçilerin ücretlerini  ucretoran tablosundaki en düşük ve en yüksek ücret alanları ile karşılaştırılıp, bu işçilerin kıdemlerini bulmayı sağlıyor. Dikkat edilirse “from” sözcüğünden sonra yazılan tablo adları için bir boşluk bıraktıktan sonra kısa bir isim verilebiliyor. Böylece uzun tablo adını sürekli yazmaktansa o tablo adı için “alias” olarak adlandırılan kısa isim kullanılabiliyor.</p>
<p>Birleştirme işlemleri yapılırken karşımıza şöyle bir problem çıkmaktadır. Birleştirme yapılan tablolardan ikinci tabloda birinci tablodaki her kaydın karşılığı olmazsa, karşılığı olmayan kayıtlar sorgu sonucunda sadece olmayan kayıtlar değil bilakis hiç kayıt gelmez. Bunun için “dış birleştirme” kullanılır. Dış birleştirme işlemi, kayıtları eksik olan tablonun şart tarafına “(+)” işareti konularak yapılır. Örneğin isci tablomuzda çalıştığı bölüm kodu 40 olan hiçbir kayıt yoktu, fakat bolum tablosunda 40 kodlu bir bölüm vardı. Bu tablolardan tüm bölümlerde çalışan işçilerin listesini veren komutun şöyle yazıldığını düşünelim:</p>
<p>Dikkat edilirse 40 nolu bölümden işçi tablosunda hiç kimse olmadığı için böyle bir bölümün var olduğu bu sorgudan anlaşılamıyor. Bu komut şöyle yazılsaydı daha doğru olacaktı:</p>
<p><strong> </strong>Bazen bir tablonun içindeki alanlar birbirleri ile ilişkili olabilir. Örneğin isci tablosunda bir işçinin müdürünün kodu tutulmakta ve bu müdürün kaydı da ayrı bir kayıt olarak yine isci tablosunda yer almakta. Burada “kendine birleştirme”(self-join) kullanılır. Aşağıda bununla ilgili bir örnek verilmiştir.</p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong>Birkaç tablo üzerinde yapılan sorgular üzerinde birleştirme ya da fark alma işlemleri yapılabilir. Bunun için UNION, INTERSECTION ve MINUS operatörleri kullanılır.  Aşağıdaki örnekte isci tablosundan yapılan iki sorgu UNION operatörü ile birleştirilmiştir.</p>
<p><strong>SQL/19</strong></p>
<p>Aşağıdaki sorgu ile çalıştığı bölüm kodu 30 olan ve müdür olmayan işçiler listelenmiştir.</p>
<p><strong> </strong>Aşağıdaki sorgu ile işi “satış gör” olan ve müdür kodu 7698 olan kayıtlar listelenmiştir.</p>
<p><strong> </strong></p>
<p>SQL*Plus kullanırken kullanıcıdan alınan bir bilgiye uyacak şekilde sorgulamalar yapılabilir.Örneğin aşağıda kullanıcının girdiği işçi numarasına ait bilgileri listeleyen bir sorgu yer almaktadır:</p>
<p><strong> </strong></p>
<p><strong> </strong>SQL’de bir sorgunun çıktısı diğer bir sorgu için girdi olarak kullanılabilir. Bunu göstermek için isci tablosu içerisinde maaşı, tüm kayıtların ortalama maaşından az olan kayıtların, listesini veren bir sorgu gösterilmiştir.</p>
<p><strong> </strong>SQL’de bir tabloya yeni bir kayıt eklemek için “INSERT INTO” komutu kullanılır. Aşağıda isci tablosuna yeni bir kayıt ekleme komutu gösterilmiştir.</p>
<pre class="brush:csharp">INSERT INTO tablo-adı (sütun1,sütun2,.......) VALUES (değer1,değer2,....)
</pre>
<p><strong> </strong></p>
<p>SQL’de bir tablodan kayıt silmek için ‘DELETE FROM’ komutu kullanılır.</p>
<p>DELETE FROM tablo-adı WHERE şart</p>
<p><strong> </strong>SQL’de bir tablodaki bir kayıtta değişiklik yapma komutu ‘UPDATE’ tir.                UPDATE tablo-adı SET sütun-adı=değer WHERE şart</p>
<p>Hayrullah AYAN</p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ceturk.com/oracle-veritabanina-kusbakisi-ders-6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<enclosure url="http://www.ceturk.com/images/oracle-logo5.gif" length="5831" type="image/jpg" />	</item>
		<item>
		<title>Oracle Veritabanına Kuşbakışı – 5.Ders</title>
		<link>http://www.ceturk.com/oracle-veritabanina-kusbakisi-ders-5/</link>
		<comments>http://www.ceturk.com/oracle-veritabanina-kusbakisi-ders-5/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 12:27:30 +0000</pubDate>
		<dc:creator>hayrullah ayan</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Veri Tabanı]]></category>
		<category><![CDATA[Hayrullah Ayan]]></category>
		<category><![CDATA[oracle backup]]></category>
		<category><![CDATA[oracle db export]]></category>
		<category><![CDATA[oracle db import]]></category>
		<category><![CDATA[Oracle Veritabanına Kuşbakışı Ders Serisi]]></category>
		<category><![CDATA[oracle yedek alma]]></category>

		<guid isPermaLink="false">http://www.ceturk.com/?p=5290</guid>
		<description><![CDATA[ORACLE’DA YEDEK ALMA VE GERİ GETİRME Oracle, verileri her ne kadar güvenli tutsa da, fiziksel sebeplerden(disk hataları), kullanıcı hatalarından veya benzer durumlardan dolayı yedeklere ihtiyaç duyulmaktadır. Yedek alma, veritabanı yöneticisinin yapacağı önemli işlerden birisidir. Oracle’da, yedek almayla ilgili değişik yöntemler vardır. Veritabanı yöneticisi, kendi veritabanının durumuna göre, yedek almayla ilgili bir veya birden fazla yöntemi [...]]]></description>
			<content:encoded><![CDATA[<h2>ORACLE’DA YEDEK ALMA VE GERİ GETİRME</h2>
<p><strong> </strong>Oracle, verileri her ne kadar güvenli tutsa da, fiziksel sebeplerden(disk hataları), kullanıcı hatalarından veya benzer durumlardan dolayı yedeklere ihtiyaç duyulmaktadır. Yedek alma, veritabanı yöneticisinin yapacağı önemli işlerden birisidir.</p>
<p>Oracle’da, yedek almayla ilgili değişik yöntemler vardır. Veritabanı yöneticisi, kendi veritabanının durumuna göre, yedek almayla ilgili bir veya birden fazla yöntemi kullanmaya karar vermelidir. Bu kararı vermede, yönetici, yedeği kimin alacağı, hangi tür depolama ünitesine alınacağı, ne kadar sıklıkla alınacağı, alınan yedeklerin büyüklüğü, veritabanında küçük de olsa bir kayıba tahammül olup olmadığı gibi çok değişik sebepleri gözönünde bulundurmak zorundadır.<span id="more-5290"></span></p>
<h3>Fiziksel Yedek Alma</h3>
<p><strong> </strong>Fiziksel yedek alma veri dosyalarının, redo log dosyalarının ve kontrol dosyalarının yedeklerinin alınması işlemidir. Bir veritabanı ARCHIVELOG ve NOARCHIVELOG olmak üzere iki farklı modda çalışabilir. ARCHIVELOG modunda yapılan tüm işlemler redo log dosyalarına otomatik olarak kaydedilir. Bunun anlamı veritabanındaki değişikliklerin sürekli dosyalara kaydedilmesidir. Kaydedilen bu dosyaların hangileri olduğu ve nerede bulundukları gibi bilgiler init&lt;SID&gt;.ora dosyası içerisinde yer alır. ARCHIVELOG modda çalışan bir veritabanında veri kaybı söz konusu değildir. Eğer veritabanı NOARCHIVELOG modda çalışıyorsa yapılan değişiklikler bir yere kaydedilmeyecektir. Bu yüzden sistemin bozulması durumunda ancak son alınan yedekler geri getirilebilir. Yani son alınan yedekten sonra yapılan değişiklikler kaybolur. İşletim sistemi yedeği alma olarak ta bilinen fiziksel yedek alma işleminin dezavantajı, yedek alma işlemi boyunca veritabanının kapatılması gereğidir.</p>
<h4>NOARCHIVELOG Modunda Yedek Alma</h4>
<p>Bu modda yedek almak için komut moduna geçilerek aşağıdaki işlemleri yapmak gerekir. Bundan önce SQL*Plus içerisinde yedeği alınacak dosyaların tespiti yapılmalıdır.</p>
<p><strong> </strong>Burada kullanılan V$LOGFILE, V$CONTROLFILE ve DBA_DATFILES dosyaları veri sözlüğündeki görüntülerdir. Bu görüntüleri sorgulayarak yedeklememiz gereken dosyaları ve bunların nerede bulunduklarını öğreniyoruz. Burada yapacağımız iş veritabanı oturumunu kapattıktan sonra, bu dosyaları bir başka depolama ünitesine kopyalamak. Veritabanını Windows NT veya Windows 2000 içerisinde, Denetim Masası’na girip “Sevices” simgesine çift tıkladıktan sonra burada “Oracle” ile başlayan tüm servisleri durdurarak kapatabiliriz. Bu işlemler komut modundan da yapılabilir. Bunun için veritabanı yüklenirken belirtilen dizin içerisindeki “Svrmgrl” programı çalıştırılır. Eğer varsayılan dizini seçtiyseniz bu “c:\oracle\ora81\bin” dizinidir. Komut modunda şu adımlar gerçekleştirilir:</p>
<pre class="brush:csharp">
svrmgr&gt;connect internal

svrmgr&gt;shutdown immediate

svrmgr&gt;exit

&gt;lsnrctl stop</pre>
<p>Buradaki işlemlerde önce sunucu yöneticisine(server manager) bağlanılıyor  ve sonra da veritabaını kapatılıyor. En sonda da Dinleyici(Listener) durduruluyor. İlgili dosyalar kopyalandıktan sonra :</p>
<pre class="brush:csharp">svrmgr&gt;connect internal

svrmgr&gt;startup</pre>
<p>Bu dosyları bir bozulma anında tekrar geri yüklemek için veritabanını kapatıp dosyaları geriye kopyalamak ve sonra yeniden veritabanını açmak gerekir. İşte burada son yapılan değişiklikler kaybolur.</p>
<h4>ARCHIVELOG Modunda Yedek Alma</h4>
<p>Bu modda yapılan değişiklikler otomatik olarak redo log dosyalarına yazıldığı için dosyaları tek tek kopyalamak gerekmez. Fakat bu değişikliklerin kaydedildiği dosyaları yedeklemek yararlı olabilir. Veritabanında bir bozukluk durumunda yapacağımız iş veritabanını kapatıp “Recover Database” komutunu kullanmak ve sonra veritabanını yeniden açmak. “Recover Database” komutunu kullanmak için veritabanı “Mount” modunda açılır.</p>
<pre class="brush:csharp">
svrmgr&gt;connect internal

svrmgr&gt;shutdown immediate

&gt;exit

&gt;lsnrctl stop

&gt;svrmgr

svrmgr&gt;connect internal

svrmgr&gt;startup mount

svrmgr&gt;recover database</pre>
<h3>Mantıksal Yedek Alma</h3>
<p><strong> </strong>Oracle’da mantıksal yedek alma denince Export ve Import anlaşılır. Bunlar Oracle firmasının geliştirdiği komut modunda çalışan yardımcı programlardır. Bu tür yedek alma veritabanı nesnelerinin yedeklenmesi olduğu için mantıksal yedek olarak adlandırılır. Yani export ile log dosyalarının ya da kontrol dosyalarının yedeği alınmaz.</p>
<h4>Export</h4>
<p><strong> </strong>Export Oracle’ın mantıksal yedek alma işlemleri için geliştirdiği bir üründür. Mantıksal yedek alma veritabanının kapatılmaması gerektiği zaman kullanılan bir yedek alma türüdür. Bu yöntemle farklı modlarda yedek alınabilir. Bunlar aşağıda açıklanacaktır. Export ile alınan yedekler ancak Import ile geri yüklenebilir. Export kullanılarak bir veritabanının yapısı veriler olmadan yedeklenebilir, belli tablolar verilerle birlikte ya da sadece yapıları ile yedeklenebilir, yani yedeklenecek veritabanı nesnelerinin seçimi yapılabilir.</p>
<p>Export almada 4 mod vardır: Birincisi Tablo Modu(Table Mode)’dur. Bu modda kullanıcılar kendi tablolarının yedeklerini alabilirler ya da hakkı olan kullanıcı bir başka kullanıcnın tablolarının yedeklerini alabilir. İkincisi Kullanıcı Modu(User Mode)’dur. Bu modda bir kullanıcının nesnelerinin yedeği alınabilir. Üçüncüsü Tam Veritabanı Modu’dur(Full Database Mode). Bu modda tüm veri tabanının yedeği alınabilir. Bu modu gerçekleştirmek için kullanıcının bazı özel haklara sahip olması gerekir. EXP_FULL_DATABASE rolüne sahip olan kullanıcı ya da DBA rolüne sahip olan kullanıcılar bu modu kullanabilir. Dördüncüsü Tablo Uzayı Modu’dur. Bu modda da tablo uzaylarının yedeği alınır.</p>
<p>Export yardımcı programını çalıştırmak için komut moduna geçilmelidir. Exp.exe dosyası Oracle8i kurulurken varsayılan dizin adı kabul edildiyse “c:\oracle\ora81\bin” dizini içerisinde bulunabilir. Aşağıdaki örnekler bu dizine geçip komut modunda yazılarak çalıştırılabilir.</p>
<p><strong>Tam Veritabanı Modu örnekleri:</strong></p>
<p>&gt;exp system/manager full=Y file=deneme.dmp</p>
<p>Yukarıdaki komut tüm veritabanının yedeğini alır. Eğer tüm veritabanı içerisinde istenilen belli özelliklerin yedeği alınmak istenirse etkileşimli metod kullanılır(aşağıdaki gibi).</p>
<p>&gt;exp system/manager</p>
<p>&#8230;&#8230;..</p>
<p>Enter array buffer size:4096&gt;(return)    ‘veri tamponunun büyüklüğü</p>
<p>Export file:EXPDAT.DMP&gt;deneme.dmp   ‘varsayılan yedekleme dosyası ismi EXPDAT.dmp</p>
<p>E(ntire databese), U(sers), T(ables):U&gt;e ‘tüm veritabanı mı? Kullanıcı ya da Tablo yedeği mi?</p>
<p>Export grants(Y/N):Y&gt;y               ‘kullanıcı haklarının yedeği alınsın mı?</p>
<p>Export Table Data(Y/N):Y&gt;y    ‘ veriler kopyalansın mı?</p>
<p>&#8230;&#8230;.</p>
<p><strong>Kullanıcı Modu Örnekleri:</strong></p>
<p><strong> </strong>&gt;exp scott/tiger file=scott.dmp</p>
<p><strong> </strong>Scott kullanıcısının tüm nesneleri ve verileri scott.dmp dosyasına yedeklenir. Etkileşimli mod için yine “&gt;exp scott/tiger”   şeklinde komut girilir.</p>
<p><strong>Tablo Modu Örnekleri:</strong></p>
<p><strong> </strong>&gt;exp system/manager tables(a,scott.b,ahmet.d) rows=n</p>
<p>System kullanıcısı kendisine ait olan a tablosunu, scott kullanıcısına ait olan b tablosunu ve ahmet kullanıcısına ait olan d tablosunu yedekliyor. “rows=n” bildirisiyle tablo verilerinin alınmamasını sadece tablonun yapılarının kopyalanmasını sağlıyor.</p>
<h4>Import</h4>
<p><strong> </strong>Export ile yedeklenen veriler Import yardımcı programıyla geri getirilebilir. Yedeklenmiş dosyanın tamamı ya da bir kısmı yedekleyen kullanıcı için geri getirilebildiği gibi bir başka kullanıcıya da aktarılabilir.</p>
<p>&gt;imp system/manager file=deneme.dmp fromuser=usr_esef  tables=(isci,bolum)</p>
<p>usr_esef kullanıcısının dneme.dmp tablosuna yedeklediği  isci ve bolum tabloları geri getirlir.</p>
<p>&gt;imp system/manager file=scott.dmp fromuser=scott touser=esef tables=(*)</p>
<p>scott kullanıcısının scott.dmp ismli yedek dosyasındaki tüm tablolar esef kullanıcısına aktarılır. Tüm tablolar için “*” işareti kullanılır</p>
<p>Hayrullah AYAN</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ceturk.com/oracle-veritabanina-kusbakisi-ders-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<enclosure url="http://www.ceturk.com/images/oracle-logo4.gif" length="5831" type="image/jpg" />	</item>
		<item>
		<title>Oracle Veritabanına Kuşbakışı – 4.Ders</title>
		<link>http://www.ceturk.com/oracle-veritabanina-kusbakisi-ders-4/</link>
		<comments>http://www.ceturk.com/oracle-veritabanina-kusbakisi-ders-4/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 14:30:51 +0000</pubDate>
		<dc:creator>hayrullah ayan</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Veri Tabanı]]></category>
		<category><![CDATA[Hayrullah Ayan]]></category>
		<category><![CDATA[oracle dersleri]]></category>
		<category><![CDATA[oracle tablo yapıları]]></category>
		<category><![CDATA[Oracle Veritabanına Kuşbakışı Ders Serisi]]></category>

		<guid isPermaLink="false">http://www.ceturk.com/?p=5288</guid>
		<description><![CDATA[ORACLE VERİTABANI NESNELERİYLE İLGİLİ KOMUTLAR Bu bolumde artık veritabanı nesneleri oluşturup yönetiyor olacagız. CREATE TABLE Tablo oluşturma komutunu anlatırken bir örnekle başlayalım. CREATE table tbl_ogr (OgrNum   NUMBER(11) NOT NULL, Ad            VARCHAR2(15), Soyad       VARCHAR2(15), Dogyer      NUMBER(2), CONSTRAINT cst_OgrNum PRIMARY KEY(OgrNum) CONSTRAINT cst_dogyer FOREING key(dogyer) REFERENCES il(ilkod)) Bu komut “tbl_ogr” adında bir tablo oluşturuyor. Tablonun [...]]]></description>
			<content:encoded><![CDATA[<h3>ORACLE VERİTABANI NESNELERİYLE İLGİLİ KOMUTLAR</h3>
<p>Bu bolumde artık veritabanı nesneleri oluşturup yönetiyor olacagız.</p>
<h4>CREATE TABLE</h4>
<p>Tablo oluşturma komutunu anlatırken bir örnekle başlayalım.<span id="more-5288"></span></p>
<pre class="brush:csharp">CREATE table tbl_ogr

(OgrNum   NUMBER(11) NOT NULL,

Ad            VARCHAR2(15),

Soyad       VARCHAR2(15),

Dogyer      NUMBER(2),

CONSTRAINT cst_OgrNum PRIMARY KEY(OgrNum)

CONSTRAINT cst_dogyer FOREING key(dogyer) REFERENCES il(ilkod))</pre>
<p>Bu komut “tbl_ogr” adında bir tablo oluşturuyor. Tablonun dört alanı var. Bunlardan biri özel anahtar(Primary Key) olarak tanımlanmış. Bu alanın değeri boş olamaz ve tabloda aynı iki değer bulunamaz.. Bir tablo ile başka bir tablo arasında ilişki kurulacaksa bu ana tabloda PRIMARY KEY tanımıyla, diğer tabloda FOREIGN KEY tanımıyla yapılır. Yani doğum yeri alanı için buradaki tablomuz ana tablo değil. Çünkü aynı yerde doğmuş kişilerin kaydı tablomuzda olabilir. Böylece aynı il kodu birden fazla kayıtta yer alabilir. İlişki kurulan diğer tablonun adını yukarıdan çıkarabiliriz. Bu tablo “il” isminde. Her il bu tabloda kayıtlı ve her birinin bir kodu var. Bu tabloda bir ilin kaydı iki sütunda yer alamaz. Bu yüzden “ilkodu” alanı “il” tablosu için PRIMARY KEY olarak tanımlanmış.</p>
<p>PRIMARY KEY, NOT NULL gibi bildirimler kısıtlamalar olarak tanımlanır. Bir tabloda farklı şekilde kısıtlamalar yapılabilir. Kısıtlama için kullanılan bildirimler 5 adettir.</p>
<ul>
<li>NOT NULL : Bu kısıtlamanın konulduğu bir alanın      mutlaka bir değeri olmak zorundadır.</li>
<li>UNIQUE : Bu kısıtlamanın konulduğu bir alan bir      değerden sadece bir adet içerebilir. Bu kısıtlamaya sahip alan NOT NULL      ile tanımlanmadıysa NULL değer alabilir.</li>
<li>PRIMARY : Bu kısıtlama bu alanın özel anahtar      olmasını sağlar. Bu alan boş geçilemez ve yine tablo içerisinde bir değer      iki kayıtta bulunamaz.</li>
<li>FOREIGN KEY : Bu kısıtlama başka bir tablonun      PRIMARY KEY olan alanıyla ilişki kurmak için gerekir.</li>
<li>CHECK : Bu kısıtlama ile birlikte bir şart      kullanılır. Tabloya kayıt girilirken değerlerin bu şarta uyması beklenir.</li>
</ul>
<h4>ALTER TABLE</h4>
<p>Daha önceden oluşturulmuş bir tablonun yapısını değiştirmek için ALTER TABLE komutu kullanılır.</p>
<pre class="brush:csharp">ALTER TABLE tablo_adı

ADD | MODIFY | DROP (&lt;sütun ismi&gt; veri tipi &lt;sütun kısıtlaması&gt;)

ENABLE ifade1

DISABLE ifade2</pre>
<p>ALTER komutuyla tablolara yeni bir alan ve kısıtlama eklenebilir, var olan alan ve kısıtlamaların durumu değiştirilebilir veya tablodan ksıtlamalar düşürülebilir. Fakat ALTER komutuyla var olan sütunlar düşürülemez. Bir alanın değeri büyültülebilir, fakat küçültülemez.</p>
<pre class="brush:csharp">ALTER TABLE tbl_ogr

ADD CONSTRAINT cst_Bolum

FOREIGN KEY(Bolum)

REFERENCES usr_gazi.tbl_bol(BolKod);</pre>
<p>Yukarıdaki örnekte tbl_ogr adlı tablonun yapısı değiştiriliyor. Bir başka kullanıcının bir tablosu ile ilişki kuruluyor.</p>
<pre class="brush:csharp">ALTER TABLE tbl_ders

MODIFY dersad varchar2(40);</pre>
<p>Bu örnekte de tbl_ders tablosunun bir alanının uzunluğu değiştiriliyor.</p>
<h4>DROP TABLE</h4>
<p>Daha önceden oluşturulmuş bir tablonun düşürülmesi için kullanılan komuttur. Kullanımı:</p>
<pre class="brush:csharp">DROP TABLE &lt;tablo_ismi&gt; [CASCADE CONSTRAINTS]</pre>
<p>Köşeli parantez içerisindeki tanım kullanılırsa master-detay ilişkili tablolarda master tablo düşürülünce detay tabloların da otomatik olarak düşürülmesi sağlanır. Eğer bu seçenek kullanılmazsa diğer tablolarla ilişkisi bulunan bir tablo silinemez. Ancak bu ilişkiler kaldırıldıktan sonra tablo silinebilir.</p>
<p>DROP TABLE tbl_ogr CASCADE CONSTRAINT</p>
<h4>CREATE VIEW</h4>
<p>Görüntü oluşturmak için bir SELECT cümlesi kullanmak gerekir. Bir görüntü bir ya da daha fazla tablodan oluşturulabileceği gibi, bir başka görüntüden de oluşturulabilir.Aşağıdaki örnekte üç farklı kullanıcnın aynı yapıdaki tabloları birleştirilip bir görüntü oluşturuluyor.</p>
<pre class="brush:csharp">CREATE VIEW vi_ogr

AS SELECT * from usr_esef.tbl_ogr
<pre>UNION ALL</pre>
<p>SELECT * FROM usr_tef.tbl_ogr<br />
UNION ALL<br />
SELECT * FROM usr_gef.tbl_ogr;</pre>
<h4>CREATE TABLESPACE</h4>
<p>Tablo uzayı kullanıcılara ait olan nesnelerin veritabanında mantıksal olarak tutulduğu yere denmektedir. Bir tablo uzayı oluştururken, bu tablo uzayının verilerinin hangi veri dosyasına konulacağı ve bu dosyanın dizini ile büyüklüğü bildirilmelidir.</p>
<pre class="brush:csharp">CREATE TABLESPACE tbs_esef

DATAFILE 'c:\orasql\tbs_esef.dat' SIZE 10M
<pre>DEFAULT STORAGE (INITIAL 10K NEXT 50K</pre>
<p>MINEXTENTS 1 MAXEXTENTS 999)<br />
ONLINE;</pre>
<p>SIZE bildirisi veri dosyasının diskte kaplayacağı yeri belirler. Burada 10M, 5K gibi değerler girilebilir. INITIAL bildirisi tablo uzayı oluşturulduğunda, ik alacağı genişleme’nin büyüklüğünü belirler. Next tablo uzayı oluşturulduktan sonra alacağı genişlemelerin büyüklüğünü belirler. MINEXTENTS tablo uzayı oluşturulduğunda ilk olarak alacağı minimum genişleme sayısının belirtildiği bölümdür. MAXEXTENTS bir tablo uzayının ilk olarak aldığı genişleme de dahil olmak üzere alabileceği maksimum genişleme sayısının belirtildiği bölümdür.</p>
<h4>CREATE USER</h4>
<p><strong> </strong>Kullanıcı veritabanı nesnelerinin sahibidir.  Kullanıcılar, nesneleri oluşturur, kullanır ve silerler. Oracle veritabanı ilk kurulduğunda standart olarak üç kullanıcı tanımlanır. Bunlardan bir SYS kullanıcısıdır. SYS kullanıcısı veri sözlüğünün sahibi olan kullanıcıdır. Tüm nesneleri oluşturma hakkına sahiptir ve diğer bütün kullanıcların nesnelerine erişebilir. SYS kullanıcısının ilk şifresi “change_on_install” olarak belirlenmiştir. İkinci kullanıcı SYSTEM kullanıcısıdır. SYSTEM kullanıcısı veri sözlüğünü kullanma hakkına sahiptir. Önemli nesneleri oluşturma hakkına da sahiptir. İlk şifresi “manager” olarak belirlenmiştir. Diğer kullanıcıların nesnelerine erişme hakkına da sahiptir. Üçüncü kullanıcı SCOTT kullanıcısıdır. SCOTT kullanıcısı veritabanına başlangıçta yüklenen demo tabloların sahibidir. Bu kullanıcının nesneleri kullanılarak SQL denemeleri yapılabilir.</p>
<p>“CREATE USER” komutunu SYS ve SYSTEM kullanıcıları standart olarak kullanabilir. Bu hak diğer kullanıcılara da verilebilir. Her kullanıcının nesnelerini tutmak için bir tablo uzayı oluşturmak sistemin performansı açısından gerklidir. Kullanıcı oluşturulurken bu tablo uzayı o kullanıcıya atanır.</p>
<pre class="brush:csharp">CREATE USER usr_esef

IDENTIFIED BY esef

DEFAULT TABLESPACE tbs_esef

QUOTA UNLIMITED ON tbs_esef</pre>
<p>Yukarıdaki örnekte usr_esef adında bir kullanıcı oluşturuluyor. Kullanıcının şifresi IDENTIFIED BY ile “esef” olarak bildiriliyor. Kullanıcının kendi nesnelerini oluşturacağı tablo uzayı için ise “tbs_esef” tablo uzayı bildiriliyor. Kullanıcının bu tablo uzayındaki tüm alanı kullanabileceği QUOTA UNLIMITED ile belirleniyor.</p>
<h4>CREATE ROLE</h4>
<p><strong> </strong>Rol veritabanındaki hakların toplanmış haline denir. Veritabanı yöneticisi rolleri kullanarak sistemin güvenliğini daha kolay sağlayabilir. Roller Oracle tarafından önceden tanımlanmış roller ve kullanıcı tanımlı roller olarak iki şekilde düşünülebilir. Oracle tarafından önceden tanımlanan roller beş tanedir:</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="173" valign="top">Rol</td>
<td width="390" valign="top">Atanmış Haklar</td>
</tr>
<tr>
<td width="173" valign="top">CONNECT</td>
<td width="390" valign="top">ALTER SESSION,CREATE CLUSTER, CREATE DATABASE LINK, CREATE   SEQUENCE, CREATE SESION, CREATE SYNONYM, CREATE TABLE, CREATE VIEW</td>
</tr>
<tr>
<td width="173" valign="top">RESOURCE</td>
<td width="390" valign="top">CREATE CLUSTER, CREATE PROCEDURE, CREATE SEQUENCE, CREATE   TABLE, CREATE TRIGGER</td>
</tr>
<tr>
<td width="173" valign="top">DBA</td>
<td width="390" valign="top">“WITH ADMIN OPTION” ile birlikte bütün sistem hakları</td>
</tr>
<tr>
<td width="173" valign="top">EXP_FULL_DATABASE</td>
<td width="390" valign="top">SELECT ANY TABLE, BACKUP ANY TABLE, SYS.INCVID, SYS.INCFIL   ve SYS.INCEXP tablolarına INSERT, UPDATE veDELETE hakkı</td>
</tr>
<tr>
<td width="173" valign="top">IMP_FULL_DATABASE</td>
<td width="390" valign="top">BECOME USER, WRITEDOWN</td>
</tr>
</tbody>
</table>
<p><strong> </strong></p>
<p><strong> </strong>CREATE ROLE tabloma_bak</p>
<pre>            GRANT SELECT ON tbl_ogr TO tabloma_bak</pre>
<p>Yukarıdaki örnekte tabloma_bak adında bir rol oluşturuluyor. Daha sonra bu role tbl_ogr tablosu üzerinde listeleme işlemi yapma hakkı veriliyor. Böylece bu rolün atandığı kullanıcı tbl_ogr tablosu üzerinde “SELECT” komutunu çalıştırabilecek.</p>
<h4>CREATE INDEX</h4>
<p><strong> </strong>Daha öncede bahsedildiği gibi indeks tablodaki kayıtlara daha hızlı erişim için kullanılan nesnelerdir. Bir indeks oluşturabilmek için “CREATE ANY INDEX” sistem hakkına sahip olmak gerekir. İndeks bir tablonun bir alanı üzerinde tanımlanabileceği gibi birden fazla alan üzerinde de tanımlanabilir.</p>
<p>CREATE INDEX indeks1 ON tbl_ogr(ogrnum,ad)</p>
<h4>CREATE SEQUENCE</h4>
<p>Sıra, sıralı olarak artan alanlar için veritabanında tutulan nesnedir. Örneğin birden başlayan ve birer birer artan bir sıra yaratmak için:</p>
<p>CREATE SEQUENCE sira1 START WITH 1 INCREMENT BY 1</p>
<h4>CREATE ROLLBACK SEGMENT</h4>
<p>Geri alma parçaları SELECT, INSERT, DELETE, UPDATE gibi komutlarla yapılan işlemlerin gerektiğinde geri alınabilmesi için veritabanında ayrılan alanlara denir. “tbsp_esef” tablo uzayını kullanan, kayıt parametrelerinden ilk parçanın büyüklüğü 10M, sonraki genişlemelerin büyüklüğü 1M, minimum genişleme sayısı 2, maksimum genişleme sayısı 121 ve ortalama değeri 30M olan ve ismi “rol_seg” olan bir geri alma parçası şöyle oluşturulabilir:</p>
<pre class="brush:csharp">CREATE ROLLBACK SEGMENT rol_seg

TABLESPCE “tbsp_esef”

STORAGE(         INITIAL           10M

NEXT                1M

MINEXTENTS    2

MAXEXTENTS   121

OPTIMAL          30M)</pre>
<h4>GRANT</h4>
<p><strong> </strong>Sistem ya da nesne haklarının kullanıcılara veya rollere atanması için kullanılan komuttur.</p>
<pre class="brush:csharp">GRANT DELETE ON tbl_ogr TO usr_gef</pre>
<p>Yukarıdaki örnekte usr_gef kullanıcısına tbl_ogr tablosunda silme yapma yetkisi verilir.</p>
<h4>REVOKE</h4>
<p><strong> </strong>Sistem ya da nesne haklarının kullanıcılardan veya rollerden geri alınnması için kullanılan komuttur.</p>
<p>REVOKE DELETE ON tbl_ogr FROM usr_gef</p>
<p>Yukarıdaki örnekte usr_gef kullanıcısından tbl_ogr tablosunda silme yapma yetkisi geri alınır.</p>
<p>** Veritabanı nesnelerinin yönetilmesiyle ilgili daha bir çok veri tanımlama dili komutu vardır. Bu komutların diğerleri burada anlatılmayacaktır. Bir nesneyi oluşturmak için “CREATE”, silmek için “DROP”, değiştirmek için “ALTER” komutlarının kullanıldığının bilinmesi diğer komutlar için bir temel teşkil edecektir. Komutlar içerisinde kullanılan parametreler Oracle yardım dokümanlarında ayrıntılı olarak verilmektedir.</p>
<p>Hayrullah AYAN</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ceturk.com/oracle-veritabanina-kusbakisi-ders-4/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<enclosure url="http://www.ceturk.com/images/oracle-logo3.gif" length="5831" type="image/jpg" />	</item>
		<item>
		<title>Oracle Veritabanına Kuşbakışı – 3.Ders</title>
		<link>http://www.ceturk.com/oracle-veritabanina-kusbakisi-ders-3/</link>
		<comments>http://www.ceturk.com/oracle-veritabanina-kusbakisi-ders-3/#comments</comments>
		<pubDate>Sat, 16 Jan 2010 17:28:42 +0000</pubDate>
		<dc:creator>hayrullah ayan</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Veri Tabanı]]></category>
		<category><![CDATA[BACKGROUND PROCESSES]]></category>
		<category><![CDATA[Hayrullah Ayan]]></category>
		<category><![CDATA[MEMORY STRUCTURE]]></category>
		<category><![CDATA[Oracle Veritabanına Kuşbakışı Ders Serisi]]></category>
		<category><![CDATA[ORACLE’DA BELLEK YAPISI]]></category>
		<category><![CDATA[Redo Log Tamponu]]></category>

		<guid isPermaLink="false">http://www.ceturk.com/?p=5286</guid>
		<description><![CDATA[ORACLE’DA BELLEK YAPISI(MEMORY STRUCTURE) VE ARKA PLAN İŞLEMLERİ(BACKGROUND PROCESSES) Bu bölüm Oracle veritabanının yönetiminin sağlanmasında kullanılan işlemleri ve bellek yapılarını içermektedir. Tüm bellek yapıları veritabanının oluşturulduğu bilgisayarın ana belleğinde yer almaktadır. Bu bölüm birden fazla kullanıcının aynı anda veritabanına erişip işlemlerini gerçekleştirmesinin nasıl olduğunu anlamak açısından önemlidir. Aşağıdaki şekil bu bölüm için temel alınacaktır. Bellek [...]]]></description>
			<content:encoded><![CDATA[<h3>ORACLE’DA BELLEK YAPISI(MEMORY STRUCTURE) VE ARKA PLAN İŞLEMLERİ(BACKGROUND PROCESSES)</h3>
<p><strong> </strong>Bu bölüm Oracle veritabanının yönetiminin sağlanmasında kullanılan işlemleri ve bellek yapılarını içermektedir. Tüm bellek yapıları veritabanının oluşturulduğu bilgisayarın ana belleğinde yer almaktadır. Bu bölüm birden fazla kullanıcının aynı anda veritabanına erişip işlemlerini gerçekleştirmesinin nasıl olduğunu anlamak açısından önemlidir. Aşağıdaki şekil bu bölüm için temel alınacaktır.<span id="more-5286"></span></p>
<h4>Bellek Yapıları</h4>
<p>Oracle işlemlerini gerçekleştirmek için bellek yapıları oluşturur ve bunları kullanır. Örneğin bellek çalışan program kodlarını ve kullanıcılar arasında paylaşılan verileri depolar. Oracle’da birkaç adet bellek yapısı mevcuttur: SGA(System Global Area), veritabanı tamponları(database buffers), redo log tamponları(redo log buffers) ve paylaşım havuzunu(shared pool) içerir.</p>
<h5>SGA(System Global Area)</h5>
<p><strong> </strong>SGA bir oracle veritabanı oturumu için gerekli verileri ve kontrol bilgilerini içeren paylaşımlı bellek bölgesidir. SGA ve Oracle arka plan işlemleri bir Oracle veritabanı oturumunu oluşturur. Veritabanı oturumu başladığında  Oracle SGA’yı oluşturur ve veritabanı kapatıldığında yok eder. Her bir veritabanı oturumunun kendine ait bir SGA ‘sı vardır. Oracle’a bağlanan kullanıcılar SGA içerisinde verileri paylaşımlı olarak kullanırlar. Yüksek performansın sağlanabilmesi için SGA’nın olabildiğince büyük olması gerekir. SGA büyük olursa bu alanda daha fazla bilgi depolanabilir ve sabit diske erişim sayısı azalır.  SGA içerisinde depolanan bilgi veritabanı tamponları, redo log tamponları ve paylaşım havuzunu içeren birkaç tip bellek yapısına bölünmüştür. Bu alanlar sabit büyüklüktedir ve veritabanı açılırken oluşturulurlar.</p>
<h6>Veritabanı Tampon Belleği(Database Buffer Cache)</h6>
<p>En son kullanılan veri blokları SGA içerisinde veritabanı tamponu denilen yerde depolanır. Bu veritabanı tamponlarının hepsi veritabanı tampon belleğini oluşturur. Veritabanı tampon belleği değiştirilmiş ve değiştirilmemiş bilgileri içerir. Son kullanılan verilerin ya da çok kullanılan verilerin bellekte depolanması sayesinde sabit disk erişim işlemleri azalır.</p>
<h6>Redo Log Tamponu(Redo Log Buffer)</h6>
<p>SGA’nın redo log tamponu veritabanı verileri üzerinde yapılan son değişiklikleri depolar. Redo log tamponunda depolanan değişiklik bilgileri veritabanı  kurtarma işlemlerinde gerekli olan redo log dosyalarına kaydedilirler.</p>
<h6>Paylaşım Havuzu(Shared Pool)</h6>
<p><strong> </strong>Paylaşım havuzu SGA’nın paylaşımlı SQL alanları gibi bellek yapılarını içeren kısmıdır. Paylaşımlı SQL alanı veritabanına girilen her farklı SQL komutunu işlemek için gerklidir. Her bir paylaşımlı SQL alanı aynı komutu işleyen birden fazla uygulama tarafından kullanılır. Burada amaç diğer kullanıcılar için daha fazla paylaşımlı bellek alanı bırakabilmektir.</p>
<h6>Geniş Havuz(Large Pool)</h6>
<p><strong> </strong>Geniş havuz SGA içerisinde isteğe bağlı bir alandır. Bu alan yedekleme, yapılan işlemleri geri yükleme, sunucunun giriş/çıkış işlemleri vb. işlemlerde daha geniş bellek ihtiyacı için kullanılan alandır.</p>
<h5>Program Genel Alanı(PGA)</h5>
<p><strong> </strong>PGA sunucu işlemleri için veri ve kontrol bilgilerini içeren bellek tamponudur. Bir sunucu işlemi başlatıldığında PGA Oracle tarafından otomatik olarak başlatılır.  Genellikle PGA bir kullanıcı ya da bağlantı için ayrılan belleğe denir. Bu bellek üç bölümü içerir: Birincisi yığın uzayı’dır(Stack Space). Yığın bir her bir bağlantıya ait değişkenleri, dizileri vb. yapıları tutan bellektir. İkincisi bağlantı bilgisi’dir(Session Information). Bağlantı bilgisi, “multitheraeded” sunucu olarak adlandırılan bir bilgisayarda çalışılmıyorsa PGA alanında, aksi halde SGA da depolanır.(“multithreaded” uygulamalar aynı kod ve data segmenti kullanıp, farklı program sayacı, kayıtlık ve yığın kullanan uygulamalar için kullanılır.) Üçüncüsü Özel SQL alanıdır. Bu alanda farklı amaçla kulanılan bazı değişkenleri tutmak için kullanılır.</p>
<h4>İşlem Yapısı(Process Architecture)</h4>
<p><strong> </strong>İşlem, işletim sistemlerinde, belli bir işi yapmak için bir adımlar dizisinin çalıştırılması olarak adlandırılmaktadır. Normalde her işlemin çalışabilmesi için bellekte kendine özel bir yeri vardır. Oracle’da da iki tür işlem vardır. Kullanıcı işlemleri(User Processes) ve Oracle İşlemleri(Oracle Processes).</p>
<h5>Kullanıcı İşlemleri(User(Client) Processes)</h5>
<p><strong> </strong>Bir kullanıcı işlemi bir uygulama ya da yazılımın çalıştırlmasını sağlamak için oluşturulur. Kullanıcı işlemleri program arayüzü(program interface) yoluyla sunucuyla iletişim işlemlerini sağlar.</p>
<p>Program arayüzü bir kullanıcı işlemlerinin sunucu ile ileitişim kurmasında kullanılan mekanizmalar olark bilinir. Program arayüzü veritabanı ile bir Oracle Forms ya da Reports programı arasında iletişim standartlarını sağlar.</p>
<h5>Oracle İşlemleri(Oracle Processes)</h5>
<p><strong> </strong>Oracle işlemleri diğer işlemler tarafından işlemin belli adımlarını gerçekleştirmesi için çağrılırlar. Oracle işlemleri de sunucu işlemleri(Server Processes) ve arka plan işlemleri(Background Processes) olarak ikiye ayrılır.</p>
<h6>Sunucu İşlemleri(Server Processes)</h6>
<p><strong> </strong>Oracle, veritabanına bağlanan bir kullanıcının isteklerini gerçekleştirebilmek için sunucu işlemlerini başlatır. Örneğin bir kullanıcının, o an SGA’nın veritabanı belleği’nde yer almayan bir bilgiyi sorgulaması, veri bloklarının veri dosyalarından okunup SGA’ya getirilmesini sağlayan sunucu işlemini başlatır. İstemci/Sunucu mimarili sistemlerde kullanıcı işlemleri ve sunucu işlemleri ayrı bilgisayarlarda çalıştırılır.</p>
<h6>Arka Plan İşlemleri(Background Processes)</h6>
<p><strong> </strong>Oracle her veritabanı için ayrı olarak bir dizi arka plan işlemleri oluşturur.  Oracle veritabanına bir anda birden fazla kullanıcının bağlandığını ve belli programları çalıştırdığını düşünelim. Oracle programlar tarafından oluşturulan bu kullanıcı işlemleri’ni gerçekleştirmek için arka planda bazı işlemler gerçekleştirir. Her bir veritabanı kendi arka plan işlmelerine sahiptir. Şimdi bu arka plan işlmelerinin neler olduğuna bakalım:</p>
<p>Veritabanı Yazıcısı(Database Writer- DBWn)</p>
<p><strong> </strong>Veritabanı yazıcısı, veritabanı tampon belleğindeki değiştirilmiş veri bloklarını veri dosyalarına yazmakla görevlidir. Normalde tek bir veritabanı yazım işlemi bir çok sistemde yeterli olmasına rağmen, birden fazla yazım işlemi tanımlanabilir. Bu işlemlere DBW0&#8230;DBW9 şeklinde isim verilir. Veritabanı açılırken bu DB_WRITER_PROCESSES parametresi ile veritabına bildirilir.</p>
<p>Bir kullanıcı yaptığı değişiklikleri “commit” komutuyla onayladığında veritabanı yazıcısı bu değişiklikleri hemen veri dosyalarına kaydetmez. Veritabanı yazıcısı veri dosyalarına yazma işlemini kendi belirler ve ya SGA içerisine çok miktarda başka verilerin alınması gerektiği zaman ya da çok az veritabanı tamponu kaldığı zaman yazma işlemini gerçekleştirir. Veri dosyalarına yazım işlemi en son kullanılan verilerden başlanarak gerçekleştirilir.</p>
<p>Log Yazıcısı(Log Writer LGWR)</p>
<p><strong> </strong>Log yazıcısı SGA’nın redo log tamponundaki bilgileri diske kaydetmek için kullanılır. LGWR tampondaki bilgileri o an kullanımda olan bir redo log dosyasına sıra ile yazar. Bu yazma işlemi veritabanının sahip olduğu birden fazla redo log dosyasına da yapılabilir.</p>
<p>Değişme Noktası(Checkpoint- CKPT)</p>
<p><strong> </strong>Belirli zamanlarda SGA içerisindeki değişikliğe uğramış veritabanı tamponları DBWn tarafından belleğe yazılır. Bu işlem değişme noktası işlemi olarak adlandırılır. Değişme noktası işlemi DBWn’e değişme anlarını haber vermekten ve veritabanındaki bütün veri dosyalarını ve kontrol dosyalarını yeni değişme noktasından haberdar etmek için güncellemekten sorumludur.</p>
<p>Sistem Analizi(System Monitor-SMON)</p>
<p><strong> </strong>Sistem Analizi veritabanı oturumu açılırken oturum için kurtarma yapar, yani kontrol dosyalarını kontrol ederek geri alınması gereken bir işlemin olup olmadığına bakar, eğer varsa geri allma işlemini gerçekleştirir. Birden fazla veritabanı oturumunun olduğu ortamlarda SMON aynı zamanda bozulan sistemler içinde ayrı ayrı kurtarma yapar. SMON aynı zamanda kullanılmayan geçici parçaları(temporary segment) temizlemekte ve herhangi bir problemden dolayı bozulan işlemleri kurtarmaktadır. Bozulan işlemlerin sorgu komutları SMON tarafından tablo uzayı ve veri dosyası tekrar aktif hale getirildikten sonra kurtarılır. Son olarak SMON veritabanında daha fazla boş yer açılsın diye boş genişlemeleri birleştirmektedir.</p>
<p>İşlem analizi(Process Monitor-PMON)</p>
<p>İşlem Analizi herhangi bir kullanıcı işlemi bozulduğunda o işlemin kurtarılmasını yapmaktadır. PMON işlemin kullandığı belleği ve kaynakları temizlemekten sorumludur. PMON aynı zamanda dispatcher(ileride anlatılıyor) ve sunucu işlemlerini         kontrol eder ve kapandıklarında yeniden çalıştırır.</p>
<p>Yedekleyici(Archiver-ARCn)</p>
<p><strong> </strong>Yeekleyici o an kullanılmakta olan redo log dosyalarını, doldukları zaman yedek depolama ünitelerine kopyalar. Tüm sistemler için bir ARC0 işleminin olması yeterli olsa da birden fazla işlem gerçekleştirilebilir. Bu LOG_ARCHIVE_MAX_PROCESSES parametrsei ile belirlenir. ARCn işlemi veritabanı ARCHIVELOG modda çalışırken kullanılır.</p>
<p>Geri Kurtarıcı(Recoverer-RECO)</p>
<p><strong> </strong>Geri kurtarıcı dağıtık veritabanında sistem veya ağ hatalarından dolayı bekleyen işlemleri düzenler. Belli aralıklarla, yerel RECO uzaktaki veritabanına bağlanıp yereldeki dağıtık işlemlerle ilgili “commit” ve “rollback” işlemlerini yapmaktadır.</p>
<p>Dispatcer(Dnnn)</p>
<p>Dispatcher’lar çoklu ortamlarda isteğe bağlı olarak çalıştırılmaktadırlar. Her iletişim protokolü için en az bir dispatcher işlemi (D000,&#8230;.,Dnnn) oluşturulmaktadır. Her dispatcher işlemi kullanıcı işlemlerinden gelen istekleri sunucu işlemlerine yönlendirmekte ve gelen cevapları da uygun kullanıcılara tekrar döndürmekten sorumludur.</p>
<p>Kilit(Lock-LCKO)</p>
<p><strong> </strong>Kilit işlemleri birden fazla veritabanı oturumunun çalıştığı sistemlerde veritabanları arasında gereken bir takım kilitleme işlemlerini gerçekleştirir.</p>
<p>İş Kuyruğu(Job Queue-SNPn)</p>
<p>Dağıtık veri tabanı uygulamalarında 38 adetten fazla (SNP0,&#8230;,SNP9,SNPA,&#8230;.SNPZ)   iş kuyruğu işlemi tablo snapshot’larını otomatik olarak güncelleyebilir. Bu işlemler periyodik olarak başlatılır.</p>
<h3>Oracle’ın Çalışmasına Bir Örnek</h3>
<p>Aşağıdaki örnek bir istemcinin ağ üzerinden sunucudaki veritabanına erişip bir sorgulama yapmasının adımlarını içermektedir.</p>
<ol>
<li>Oracle veritabanı “host” ya da “database server” olarak      adlandırılan bilgisayarda çalışıyor vaziyettedir.</li>
<li>Bir kullanıcı istemci bilgisayarda kullanıcı işlemlerini      gerçekleştiren bir uygulama programını çalıştırmaktadır. İstemci      bilgisayar sunucu bilgisayar ile bağlantısını uygun Net8 sürücüsünü      kullanarak gerçekleştirir.</li>
<li>Sunucu bilgisayarda da uygun bir Net8 sürücüsü çalışıyor      vaziyettedir.  Sunucu uygulama      programından gelen bağlantı isteğini tespit eder ve kullanıcı işlemine      karşılık gelen sunucu işlemini oluşturur.</li>
<li>Kullanıcı bir SQL komutu çalıştırır ve yaptığı değişikliği      “commit” eder, yani onaylar.Örneğin kullanıcı bir tablo içerisindeki      bir  kaydı değiştirir.</li>
<li>Sunucu işlemi komutu alır ve paylaşım havuzunda bu SQL komutuna      benzeyen bir paylaşımlı SQL alanı olup olmadığına bakar. Eğer böyle bir      alan bulunursa sunucu işlemi kullanıcının bu SQL cümlesini çalıştırma      haklarını kontrol eder. Eğer böyle bir alan yoksa  yeni bir paylaşımlı SQL alanı      oluşturulur ve SQL komutu çalıştırılır.</li>
<li>Sunucu işlemi bu SQL komutu için gerekli verilerin SGA’da olup      olmadığına bakar. Eğer burada yoksa ilgili veri dosyasından verileri alıp      SGA’ya getirir.</li>
<li>Sunucu işlemleri komutun gereklerine göre SGA’daki verileri      değiştirir. DBWn değiştirilmiş veri bloklarını gerekli olduğu zaman kalıcı      olarak diske kaydeder. SQL komutu onaylandığı için LGWR işlemi yapılan SQL      işlemini redo log dosyalarına kaydeder.</li>
</ol>
<ol>
<li>Eğer SQL komutunun çalıştırılması başarılı olduysa sunucu işlemi ağ üzerinden istemcideki uygulamaya mesaj gönderir. Eğer başarılı olmadıysa uygun hata mesajını gönderir.</li>
</ol>
<ol>
<li>Tüm bu işlemler yapılırken veritabanı sunucusu diğer      kullanıcıların aynı ya da farklı veriler üzerindeki işlemlerini de      yürütür. Bu işlemlerin yapılabilmesi       ve performansın artırılması için örneğimiz içerisinde anlatılmayan      başka arka plan işlemleride gerçekleştirilir.</li>
</ol>
<h2>Veri Tanımlama Dili Komutları</h2>
<p><strong> </strong>SQL’de veritabanı nesnelerini oluşturma, silme, yapısını değiştirme işlemleri için kullanılan komutlara veri tanımlama dili komutları denir. Bu komutlar “create”, “alter”, “drop”, “grant”, “revoke”, “analyze”, “audit”, “comment” komutlarıdır. Şimdi bu komutları kullanarak veritabanı nesneleri ile işlemler yapacağız.</p>
<h3>Veri Sözlüğü</h3>
<p><strong> </strong>Veri sözlüğü, Oracle veritabanı ile ilgili bilgilerin yine Oracle veritabanında tablolar ve görüntüler halinde saklanmasıyla oluşur. Veritabanı ile ilgili bu bilgiler kullanıcılar, haklar, veritabanı nesneleri, tablo kısıtlamaları vb. bilgilerinden oluşur. Veri sözlüğü Oracle veritabanın en önemli bölümüdür. Veritabanı hakkındaki tüm bilgiler veri sözlüğünden SQL komutları yazarak öğrenilebilir.</p>
<p>Veri sözlüğü, veritabanı kurulurken standart olarak oluşturulur ve yapılan değişiklikler otomatik olarak veri sözlüğüne yansıtılır. Örneğin bir kullanıcı bir tabloya bir alan eklerse, veri sözlüğünde o tabloya ilişkin yapı kullanıcı farketmeden değiştirilir böylece veri sözlüğünden veritabanı hakkında sürekli olarak güncel ve sağlıklı bilgi almak mümkün olur. Veri sözlüğü içerisindeki bilgiler SQL komutlarıyla sorgulanıp görülebilir. Fakat hiçbir kullanıcı veri sözlüğünü değiştiremez, ekleme yapamaz ve kayıt silemez. Veritabanı oluşturulurken oluşturulan veri sözlüğü tabloları SYS adlı kullanıcıya aittir. Veri sözlüğü tabloları için görüntüler oluşturulmuştur. Tüm kullanıcılar hakları olduğu müddetçe bu görüntülerden bir ya da birkaçını sorgulayabilirler. Veri sözlüğü görüntüleri, başlarındaki ön eklerine göre üç gruba ayrılır:</p>
<ul>
<li>USER_xxx : Veritabanına o an bağlı olan kullanıcının sahip olduğu      nesneler ile ilgili görüntülerdir.</li>
<li>ALL_xxx : Veritabanına o an bağlı olan kullanıcının sahip olduğu      ve başkalarına ait olan ve kendisine kullanma hakkı verilmiş olan tüm      nesnelerle ilgili görüntülerdir.</li>
<li>DBA_xxx : DBA(veritabanı yöneticisi) veya DBA hakkına sahip      kullanıcıların görebileceği görüntülerdir.</li>
</ul>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="137" valign="top">Görüntü İsimleri</td>
<td width="402" valign="top">Açıklama</td>
</tr>
<tr>
<td width="137" valign="top">USER_TABLES</td>
<td width="402" valign="top">Kullanıcıların sahip olduğu tabloların yapısını   gösteren görüntüdür.</td>
</tr>
<tr>
<td width="137" valign="top">USER_SEQUENCES</td>
<td width="402" valign="top">Kullanıcının sahip olduğu sıralar hakkında bilgi   içeren görüntüdür.</td>
</tr>
<tr>
<td width="137" valign="top">USER_VİEWS</td>
<td width="402" valign="top">Kullanıcının sahip olduğu görüntüler hakkında   bilgi içeren görüntüdür.</td>
</tr>
<tr>
<td width="137" valign="top">ALL_OBJECTS</td>
<td width="402" valign="top">Kullanıcının erişebileceği bütün nesneler hakkında   bilgi içeren görüntüdür.</td>
</tr>
<tr>
<td width="137" valign="top">DBA_USERS</td>
<td width="402" valign="top">Veritabanındaki bütün kullanıcılar hakkında bilgi   içeren görüntüdür.</td>
</tr>
<tr>
<td width="137" valign="top">DBA_TABLESPACES</td>
<td width="402" valign="top">Veritabanındaki bütün tablo uzayları hakkında   bilgi içeren görüntüdür.</td>
</tr>
</tbody>
</table>
<p><strong> </strong></p>
<p>SCOTT kullanıcısının bütün nesnelerini görmesi</p>
<p>SELECT * FROM USER_OBJECTS</p>
<p>Bir kullanıcın kendine ait bütün tabloların adlarını listelemesi</p>
<p>SELECT TABLE_NAME FROM USER_TABLES</p>
<p>Bir kullanıcının tüm indeks bilgilerini listelemesi</p>
<p>SELECT INDEX_NAME,TABLE_NAME,TABLESPACE_NAME FROM ALL_INDEXES</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ceturk.com/oracle-veritabanina-kusbakisi-ders-3/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	<enclosure url="http://www.ceturk.com/images/oracle-logo2.gif" length="5831" type="image/jpg" />	</item>
		<item>
		<title>Oracle Veritabanına Kuşbakışı – 2.Ders</title>
		<link>http://www.ceturk.com/oracle-veritabanina-kusbakisi-ders-2/</link>
		<comments>http://www.ceturk.com/oracle-veritabanina-kusbakisi-ders-2/#comments</comments>
		<pubDate>Thu, 14 Jan 2010 17:17:04 +0000</pubDate>
		<dc:creator>hayrullah ayan</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Veri Tabanı]]></category>
		<category><![CDATA[Hayrullah Ayan]]></category>
		<category><![CDATA[oracle Kontrol Dosyaları]]></category>
		<category><![CDATA[oracle log dosyaları]]></category>
		<category><![CDATA[oracle stored procedure]]></category>
		<category><![CDATA[ORACLE VERİTABANI YAPISI]]></category>
		<category><![CDATA[Oracle Veritabanına Kuşbakışı Ders Serisi]]></category>
		<category><![CDATA[tablespace]]></category>

		<guid isPermaLink="false">http://www.ceturk.com/?p=5283</guid>
		<description><![CDATA[Bu dersde oracle veritabanı yapısını anlamaya çalışacağız, bir çok kısım mantıksal olduğu için kafamızda tam oturmayabilir fakat bunları bilmemiz gerekiyor. Oracle veritabanının, işletim sistemi tarafından bakıldığında, biri fiziksel diğeri mantıksal olmak üzere iki bölümü vardır. Fiziksel bölüm, işletim sisteminden görünen kısımdır. Bunlar Data File(Veri Dosyası), Control File(Kontrol Dosyası) ve Log File(Log Dosyası) ‘dan oluşmaktadır. Mantıksal [...]]]></description>
			<content:encoded><![CDATA[<p>Bu dersde oracle veritabanı yapısını anlamaya çalışacağız, bir çok kısım mantıksal olduğu için kafamızda tam oturmayabilir fakat bunları bilmemiz gerekiyor.</p>
<p>Oracle veritabanının, işletim sistemi tarafından bakıldığında, biri fiziksel diğeri mantıksal olmak üzere iki bölümü vardır. Fiziksel bölüm, işletim sisteminden görünen kısımdır. Bunlar Data File(Veri Dosyası), Control File(Kontrol Dosyası) ve Log File(Log Dosyası) ‘dan oluşmaktadır. Mantıksal Bölüm, bir ya da daha fazla tablo uzayı(Tablespace) ve tablolar(table), görüntüler(view), sıralar(sequence), eşanlamlar(synonym), indeksler(index), kümeler(cluster), veritabanı bağlantıları (database link), prosedürler(procedure), fonksiyonlar(function), ve paketlerden(package) oluşan şema nesnelerinden oluşmaktadır.<span id="more-5283"></span> Fiziksel bölüm işletim sistemi tarafından görülebilmesine rağmen, mantıksal bölüm ancak Oracle’a bağlanıp, SQL komutları çalıştırılarak görülebilmektedir. Yani, Oracle kurulu herhangi bir makinede, SQL bilgisi olmayan bir insan, Oracle’ın sadece fiziksel bölümünü görebilmektedir.</p>
<p>Oracle veritabanındaki her nesnenin bir sahibi(kullanıcı olarak bahsedilir) vardır. Her kullanıcı bir veya daha fazla tablo uzayına sahip olabilir. Her nesne, ait olduğu kullanıcının herhangi bir tablo uzayında (mantıksal olarak) bulunur. Her tablo uzayı da, kendisine sahip olan kullanıcının nesnelerini tutmak için işletim sisteminde bir veya daha fazla veri dosyasına sahip olabilmektedir.</p>
<p>Sonuç itibariyle, veritabanındaki her nesnenin bir kullanıcısı vardır ve bu nesneler mantıksal olarak o kullanıcının sahip olduğu tablo uzaylarının herhangi birinin (hangisi olduğu komutlarla öğrenilebilir) içerisinde, fiziksel olarak da o kullanıcının sahip olduğu tablo uzayının herhangi bir veri dosyasında bulunur. Fakat, o veri dosyasının içerisine işletim sisteminden bu nesneyi bulmak için bakılamaz. Bu nesnenin sahibi ve mantıksal yeri “DML”(veri işleme dili) komutları ile bulunabilmektedir.</p>
<h3>Fiziksel Bölüm</h3>
<p>Fiziksel bölüm veritabanını oluşturan işletim sistemi dosyalarıdır. Bir Oracle veritabanı fiziksel olarak bir ya da daha fazla veri dosyası, iki ya da daha fazla log dosyası, bir ya da daha fazla kontrol dosyasından oluşur.</p>
<h4>Veri Dosyaları(Data Files)</h4>
<p>Veri dosyaları veri tabanındaki tüm verileri tutan dosyalardır. Tablo, indeks gibi mantıksal veritabanı yapılarının içerisindeki veriler fiziksel olarak veri dosyalarında tutulurlar. Bir veri dosyası kendisi için ayrılan alan dolduğunda,  kendi sahip olduğu alanı artırabilecek özelliklere sahiptir. Bir ya da daha fazla veri dosyası mantıksal bir veritabanı depolama ünitesi olan bir tablo uzayını oluşturular.</p>
<p>Normal veritabanı işlemleri boyunca bir veri dosyası içerisindeki veriler okunur ve Oracle için ayrılan belleğe getirilirler. Örneğin bir kullanıcının veritabanındaki bir tablonun verilerine erişmek istediğini varsayalım. Eğer istenilen veriler bellekte yer almıyorsa, ancak o zaman uygun veri dosyasından okunur ve belleğe getirilirler.</p>
<p>Değişikliğe uğrayan veriler ya da yeni eklenen veriler veri dosyalarına hemen yazılmazlar. Sabit diske erişimi azaltmak ve böylece sistemin performansını artırmak için veriler bellek havuzunda tutulur ve gerektiğinde hepsi birden uygun veri dosyalarına kaydedilirler. Bunu Oracle artalan işlemleri belirler.</p>
<h4>Kontrol Dosyaları(Control Files)</h4>
<p><strong> </strong>Tüm Oracle veritabanları kontrol dosyasına sahiptir.  Bir kontrol dosyası veritabanı adı, veri dosyaları ve log dosyalarının adı ve diskteki yeri, veritabanının oluşturulma tarihi vb. veritabanı ile ilgili bilgileri tutar.</p>
<p>Her veritabanı oturumu açıldığında Oracle bu dosyayı kontrol ederek gerekli bilgileri alır. Eğer veritabanında fiziksel bir değişme olursa(yeni bir log dosyası ya da veri dosyası oluşturulması gibi), yapılan değişiklikler Oracle tarafından otomatik olarak kontrol dosyalarına yansıtılır.</p>
<h4>Log Dosyaları(Log Files)</h4>
<p><strong> </strong>Redo Log dosyaları olarak bilinen bu dosyaların amacı veriler üzerinde yapılan tüm değişiklikleri kaydetmektir. Eğer veri dosyalarına kalıcı olarak kaydedilmiş olan, değişikliğe uğramış kayıtlarda bir bozukluk olursa yapılan değişiklikler redo log dosyalarından sağlanabilir ve işlemler kaybolmaz. Birden fazla tekrarlanan bozukluk durumlarında redo log dosyalarının da bozulmasını engellemek için Oracle farklı diskler üzerinde redo log dosyalarının birden fazla kopyasının alınmasına olanak sağlar.</p>
<p>Bir veritabanı işlemi sırasında elektrik kesilirse, bellekteki veriler veri dosyalarına kaydedilmeyecek ve verilerin kaybolması durumuyla karşılaşılacaktır. Oracle veritabanı tekrar açıldığında redo log dosyalarında yapılan son değişiklikler veri dosyalarına yansıtılarak verilerin kaybolması engellenir.</p>
<h3>Mantıksal Bölüm</h3>
<p><strong> </strong>Oracle veritabanının mantıksal yapısı tablo uzaylarını(tablespaces), şema nesnelerini(schema objects), veri bloklarını(data blocks), genişlemeleri(extents) ve parçaları(segments) içerir.</p>
<h4>Tablo Uzayı(TableSpace)</h4>
<p><strong> </strong>Bir veritabanı, ilişkili mantıksal yapıların gruplanmasını sağlayan ve tablo uzayı olarak bilinen mantıksal depolama ünitelerine bölünmüştür.</p>
<p>Yukarıdaki şekil veritabanı, tablo uzayı ve veri dosyaları arasındaki ilişkiyi açıklamaktadır. Buna göre:</p>
<ul>
<li>Bir veritabanı bir ya da daha fazla tablo uzayına bölünmüştür.</li>
<li>Tablo uzayı içerisindeki tüm mantıksal yapıları fiziksel olarak depolayabilmek için, her tablo uzayı bir ya da daha fazla veri dosyasına sahip olabilir.</li>
<li>Tablo uzaylarının toplam kapasitesi, sahip oldukları veri dosyalarının toplam kapasitesine eşittir.(Yukarıdaki şekil için SYSTEM tablo uzayı 2MB, USERS tablo uzayı 4MB).</li>
<li>Tablo uzaylarının toplam kapasitesi veritabanının toplam kapasitesini belirler.(6 MB)</li>
</ul>
<p>Bir tablo uzayı açık ya da kapalı olabilir. Tablo uzayı kapalı olduğunda bu tablo uzayının içerisindeki nesnelere erişilemez. Bir tablo uzayı yönetim amaçlı olarak kapalı duruma alınabilir.</p>
<h4>Veri Tabanı Şema Nesneleri</h4>
<p><strong> </strong>Şema nesneleri mantıksal veri depolama yapıları olarak bilinir. Veritabanı üzerinde kullanıcının belirli işleri yapabilmesi için tanımlanan bu yapılar tablolar, görüntüler, sıralar, eşanlamlar, indeksler, kümeler, veritabanı bağlantıları, prosedürler, fonksiyonlar, ve paketlerdir. Bir şema ise bu nesnelerin oluşturduğu gruptur.</p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<h5>Küme(CLUSTER)</h5>
<p><strong> </strong>Aynı anda sorgulanan birden fazla tablonun bir arada kaydedilmesine “cluster” denir. Bu yapı, beraber sorgulanan tablolarda hız kazanmak için çok önemlidir. Örneğin “isci” tablosu ile “bolum” tablosunun(bu tabloların yapısı için SQL bölümüne bkz.) her ikisi de ortak olarak “bolum” ve “bolumno” alanlarını içermekte. Yani “isci” tablosundaki “bolum”, “bolum” tablosundaki “bolumno” alanına karşılık geliyor. Burada oluşturulacak bir cluster’da her iki tablo veritabanında yan yana getirilerek aynı veri bloğu içerisine kaydedilir.Böylece daha hızlı erişim sağlanır.</p>
<h5>İndeks(INDEX)</h5>
<p>İndeksler tablo ve cluster’lar için kullanılan veri tabanı nesneleridir. Burada amaç aranılan bir kayda daha hızlı erişimdir. Özellikle üzerinde çok arama yapılan alan veya alanlar üzerinde indeks oluşturmak çok etkilidir.  İndeks oluşturulduğunda ilgili tablonun kayıtları yer değiştirmez. Sadece ilgili kayıtların kayıt numaraları olarak adlandırılan “rowid” ‘ler alınarak sıralama yapılır.</p>
<p>Bir tablo üzerinde oluşturulabilecek indeks sayısı sütunların kombinasyonları farklı olduğu müddetçe sınırsızdır. Bir sütun diğer sütunlarla değişik kombinasyonlarda kullanıldığı müddetçe birden fazla indeks içerisinde yer alabilir.  Aynı sütun kombinasyonlarının indeksi, faklı indeks ismi kullanarak oluşturulmaya çalışılsa bile gerçekleştirilemez.</p>
<p>İndeksleme işleminin gerçekleştirilmesinde Oracle çoğunlukla B-tree indeksleme metodunu kullanır. Bunun yanında “hash cluster indexes”, “reverse key indexes”, ve “bitmap indexes” yöntemlerini de kullandığı bilinmektedir.</p>
<p>İndeksler mantıksal ve fiziksel olarak oluşturuldukları tablodan bağımsızdırlar. Eğer bir indeks silinirse, ilgili tablo zarar görmez, çalışmaya devam eder. Fakat indeks olmadığı için veri erişim süresi artacaktır.</p>
<p>Oracle bir indeks oluşturulduğunda onu otomatik olarak kullanmaya başlar ve  indeksin oluşturulduğu tablodaki silme, güncelleme ve ekleme işlemleri indekse otomatik olarak yansıtılır.</p>
<h5>Rol(ROLE)</h5>
<p>Oracle veritabanında her nesnenin ait olduğu bir kullanıcı vardır. Bir kullanıcı bir başka kullanıcının nesneleri üzerinde işlem yapmak isterse buna hakkı olması gerekir. Bir nesne üzerinde işlem yapabilme yetkisine hak denir. Örneğin veritabanına bağlanma, tablo oluşturma, bir başkasına ait tablodan kayıt listeleme, bir başkasının prosedürünü çalıştırma birer haktır. Bu haklar kullanıcılara atanmak suretiyle kullanıcıların bu işlemeleri gerçekleştirmeleri sağlanır. Hakların kullanıcılara atanması iki şekilde olabilir. Birinci olarak  bir tabloya kayıt ekleme, kayıt silme vb. haklar bir kullanıcıya ya da kullanıcılara ayrı ayrı atanır. İkinci şekilde ise verilmek istenen haklar bir rol altında birleştirilir ve bu rol istenen kullanıcılara aktarılır.</p>
<p>Haklar “sistem hakları” ve “nesne hakları” olmak üzere ikiye ayrılır. Sistem hakları veritabanı ile ilgili olarak önceden tanımlanmış rollerdir. Oracle’da 60’tan fazla sistem hakkı tanımlanmıştır. Nesne hakları ise veri tabanı nesneleri üzerinde işlem yapma haklarıdır. “Create Table”, “Create TableSpace”, “Drop Any Index” gibi haklar sistem haklarına örnek olarak verilebilir.  Nesne hakları ise 8 çeşittir. “Select”, “Insert”, “Update”, “Delete”, “Alter”, “Index”, “Execute”, “References”, “All” çeşittir. “All” ayrı bir hak olarak adlandırılmaz. Diğer tüm hakları kapsar. Bu haklar sırayla kayıt seçme, kayıt güncelleme, kayıt silme, nesnelerin yapısını değiştirme, indeks oluşturma, alt program çalıştırma, yabancı anahtar tanımlayabilme işlemlerini içerirler. Rol tanımlama ve hak verme komutları ileride ayrıntılı olarak işlenecektir.</p>
<h5>Geri Alma Parçası(ROLLBACK SEGMENT)</h5>
<p><strong> </strong>Oracle veritabanının güvenliği açısından “Select”, “Insert”, “Update”, “Delete” gibi işlemlerin yedeğini almaktadır. Alınan bu yedeklerin konulduğu yerlere geri alma parçası denir. Kullanıcı bu tip işlemleri yaptıktan sonra       “Rollback” komutunu uygularsa, yaptığı değişiklikler geri alma parçalarından getirilir ve böylece kayıtlar eski haline dönmüş olur. Kullanıcı “Commit” komutunu verirse yaptığı değişiklikler geri alma parçalarından geri getirilemez. Her veritabanında bir ya da birkaç tane geri alma parçası olabilir.</p>
<h5>Sıra(SEQUENCE)</h5>
<p><strong> </strong>Tablolardaki kayıtlar için otomatik sıra numarası verilmesi isteniyorsa sıra nesnesi kullanılabilir. Bu sıra numarası veritabanı tarafından otomatik olarak üretilir.  Özellikle çok kullanıcılı ortamlarda tekil olarak numara üretilmek istendiğinde çok kullanışlıdır.  Birden fazla kullanıcı aynı anda böyle bir sayı üretmek isterse bunun program koduyla yapılması işlem hızını yavaşlatır. Çünkü bir kullanıcı diğeri işini bitirene kadar beklemek zorundadır. Sıra nesnesi bu işi otomatik olarak ve çok seri bir şekilde başarır.</p>
<p>Sıra numaraları Oracle’da tanımlı 38 rakama kadar tamsayılardan oluşur. Bir sıra tanımlaması sıranın adını, artan ya da azalan olacağını, iki sayı arasındaki fark miktarını içerir. Oracle tüm sıra numarası tanımlarını SYSTEM tablo uzayının içerisindeki bir veri sözlüğü tablosuna kaydeder. SYSTEM tablo uzayı sürekli çalışır durumda olduğu için tüm sıra numaraları da aktiftir. Sıra numaraları tablolardan bağımsız olarak üretilir. Yani bir sıra numarası bir ya da daha çok tablo için kullanılabilir.</p>
<h5>Kayıtlı Fonksiyonlar(STORED FUNCTION) ve Kayıtlı Prosedürler(STORED PROCEDURE)</h5>
<p><strong> </strong>Bir grup SQL ya da PL/SQL komutunun belli bir işi gerçekleştirmek için bir araya getirilip veritabanına kaydedilmesi kayıtlı prosedürler ve fonksiyonlar sayesinde olur. Birden fazla uygulama programı içerisinde aynı işi yapan kodları sürekli yazmak yerine kayıtlı prosedür ve fonksiyonlar bir kere yazılır ve tüm uygulamalar tarafından kullanılır. SQL*Plus, Oracle Forms ya da Oracle Reports içerisinden bu prosedürler çağrılabilir. Prosedürler geriye birden fazla değer döndürebilirken, fonksiyonlar  sadece bir değer döndürürler.</p>
<h5>Eşanlam(SYNONYM)</h5>
<p><strong> </strong>Eşanlam bir tablo, görüntü, sıra, prosedür, fonksiyon ya da paket için “alias” olarak adlandırılan bir takma isimdir. Eşanlam bir takma isim olduğu için veri sözlüğü içerisindeki tanımının kapladığı yer haricinde, veritabanında yer kaplamaz. Eşanlamlar güvenlik ve daha rahat kod yazma amacıyla kullanılırlar. Bir eşanlam kullanıldığında ilgili nesnenin adı ve sahibi gizlenir ve SQL komutu içerisinde kullanımı kolaylaşır.</p>
<p>Eşanlamlar genel(Public) ve özel(Private) olarak tanımlanabilirler. “Genel” olarak tanımlanan eşanlamlara tüm veritabanı kullanıcıları erişebilir. “Özel” olarak tanımlanan eşanlamlara sadece ilgili nesnenin sahibi ve sahibi tarafından hak verilmiş bir başka kullanıcı erişebilir.</p>
<p>Bir nesnenin adı değiştirilmek istendiğinde ya da silinmek istendiğinde, bu nesneyi kullanan tüm uygulama programları değiştirilmek zorundadır. Oysa ki bu nesnenin bir eşanlamı oluşturulursa ve uygulama programları bu eşanlamı kullanırsa, eşanlam üzerinde yapılacak değişikliklerle bu silme vb. işlemlerden uygulama programlarının etkilenmesi önlenebilir.</p>
<p>Bir kullanıcı bir başka kullanıcının nesnesini kullanmak istediğinde “kullanıcı_adı.nesne_adı” şeklinde bir yazım kuralına uymak zorundadır. Eğer bir “genel” olarak bir eşanlam tanımı yapılırsa tüm kullanıcılar direk eşanlam ismini kullanarak işlemlerini gerçekleştirebilirler.</p>
<h5>Tablo(TABLE)</h5>
<p><strong> </strong>İlişkisel Veri Tabanı Yönetim Sistemleri’nde veriler tablolar içerisinde yer alır. Her tablo bir isimle tanımlanır ve her biri  bir “kayıt” olarak adlandırılan satırlar ile bu kayıtlardaki verilerin özelliklerini belirleyen sütunlardan oluşur. Her tablo bir ya da daha fazla sütuna sahip olabilir. Her sütunun bir adı ve veri tipi vardır.</p>
<p>Bir tablo oluşturulduğunda Oracle verileri depolamak için bir tablo uzayı içerisinde bir veri segmenti ayırır. Veri segmentinin değerleri değiştirilerek bir tablo için ayrılacak yer miktarı da değiştirilebilir.</p>
<h5>Görüntü(VIEW)</h5>
<p>Görüntü bir ya da birkaç tablodan istenilen alanların alınmasıyla oluşturulan sanal bir tablodur. Görüntü bu tablolar üzerinde gerçekleştirilen bir sorgu sonucu oluşturulur. Bir görüntü üzerinde silme, güncelleme gibi işlemler yapılamaz. Çünkü görüntü oluşturulduğu tabloların sadece o anlık görüntüsüdür ve veritabanında kendi tanımının kapladığı yer haricinde yer kaplamaz.</p>
<h4>Veri Blokları(Data Blocks), Genişlemeler(Extents),Parçalar(Segments)</h4>
<p><strong> </strong>Oracle veritabanında verilerin depolandığı en küçük birim veri bloğu olarak adlandırılır.Bir veri bloğu veritabanının depolama alanı üzerindeki belli bir byte uzunluğuna karşılık gelir. Veri bloğunun uzunluğu veritabanı oluşturulurken belirlenir.</p>
<p>Veri bloklarının bir üst birimi genişleme olarak adlandırılır. Bir genişleme art arda olan belirli sayıda veri bloğundan oluşur.</p>
<p>Genişleme’lerin bir üst birimi de parça’lardır. Parçalar belli bir mantıksal yapı için ayrılmış bir dizi genişleme’den oluşurlar. Farklı amaçlar için kullanılan parçalar vardır. Bunlar veri parçaları(data segments), indeks parçaları(index segments), geri alma parçaları(rollback segments) ve geçici parçalardır(temporary segment).</p>
<p>Bir tablo bir veri parça’sından oluşur. Tablonun verileri bu parça içerisindeki genişlemelere kaydedilir.(Oracle8i ile birlikte gelen yeni bir özellik olan bölümlenmiş tablo yapısında her bölüm bir veri parça’sına karşılık gelir.). Yine bir küme(cluster)’de bir veri parça’sından oluşur ve küme içerisindeki tüm tablolar o kümenin veri parça’sında yer alır.</p>
<p>Her bir indeks’te bir indeks parçasından oluşur ve indeks’in bütün verileri indeks parça’sında yer alır. Bir veritabanında, veritabanı kurtarma işlemleri(database recovery) ve yapılan değişkilikleri geri alma işlemleri(rollback) için bir ya da daha fazla geri alma parça’ları yer alır. Geçici parça’lar Oracle tarafından SQL komutları işletilirken ihtiyaç olduğunda oluşturulur ve SQL komutu işlemini bitirdiğinde bu parça tekrar sistemin kullanımına bırakılır.</p>
<p>Hayrullah Ayan</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ceturk.com/oracle-veritabanina-kusbakisi-ders-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<enclosure url="http://www.ceturk.com/images/oracle-logo1.gif" length="5831" type="image/jpg" />	</item>
		<item>
		<title>Oracle Veritabanına Kuşbakışı – 1.Ders</title>
		<link>http://www.ceturk.com/oracle-veritabanina-kusbakisi/</link>
		<comments>http://www.ceturk.com/oracle-veritabanina-kusbakisi/#comments</comments>
		<pubDate>Thu, 14 Jan 2010 17:00:08 +0000</pubDate>
		<dc:creator>hayrullah ayan</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Veri Tabanı]]></category>
		<category><![CDATA[Hayrullah Ayan]]></category>
		<category><![CDATA[oracle dersleri]]></category>
		<category><![CDATA[oracle rdbms]]></category>
		<category><![CDATA[oracle ürünleri]]></category>
		<category><![CDATA[Oracle Veritabanına Kuşbakışı Ders Serisi]]></category>
		<category><![CDATA[sql plus]]></category>

		<guid isPermaLink="false">http://www.ceturk.com/?p=5280</guid>
		<description><![CDATA[Bu dersleri Oracle veritabanına kuşbakışı bakmamızı sağlaması adına hazırladım. Bir çok arkadaşımızın Oracle ile tanışıklığı başlangıcında ençok problem yaşadığı nokta ingilizcesinin yetersiz olduğu idi.Bu derslerde nerdeyse tamamını türkçeleştirdim, fakat burda biraz basitleştirme  veya komik  ifadeler yer aldı. Örneğin tablespaces = tablo uzayları  ama tablespaces’i tablo uzayları olarak bilmek oracle ile ilerledikçe tablespaces’le karşılasınca bu ifadeyi [...]]]></description>
			<content:encoded><![CDATA[<p><strong><em>Bu dersleri Oracle veritabanına kuşbakışı bakmamızı sağlaması adına hazırladım.</em></strong></p>
<p><strong><em> Bir çok arkadaşımızın Oracle ile tanışıklığı başlangıcında ençok problem yaşadığı nokta ingilizcesinin yetersiz olduğu idi.Bu derslerde nerdeyse tamamını türkçeleştirdim, fakat burda biraz basitleştirme  veya komik  ifadeler yer aldı. Örneğin tablespaces = tablo uzayları  ama tablespaces’i tablo uzayları olarak bilmek oracle ile ilerledikçe tablespaces’le karşılasınca bu ifadeyi tanımama gibi  yeni problemlere yol açacaktı bu yüzden kimi yerlerde isimleri karışık verdim. 9. ve 10. dersleri hepimizin çok dikkat etmesi gereken bir konu olan  SQL Tuning’e ayırdım.  Faydalı oldumsa ne mutlu&#8230;</em></strong></p>
<p>İlişkisel Veritabanı Yönetim Sistemleri (Relational Database Management Systems &#8211; RDBMS) büyük miktarlardaki verilerin güvenli bir şekilde tutulabildiği, bilgilere hızlı erişim imkanlarının sağlandığı, bilgilerin bütünlük içerisinde tutulabildiği ve birden fazla kullanıcıya aynı anda bilgiye erişim imkanının sağlandığı programlardır. Oracle veritabanı da bir ilişkisel veri tabanı yönetim sistemidir.<span id="more-5280"></span></p>
<p>Oracle veritabanının özellikleri şunlardır:</p>
<ul>
<li>Büyük miktarda veri tutabilmekte ve verilerin      depolandığı alanları ayarlama imkanı vermektedir.</li>
<li>Aynı anda çok sayıda kullanıcıya verilerin      bütünlüğünü bozmadan hizmet verebilmektedir. Oracle 11g sürümü ile      birlikte on binlerce kullanıcıya hizmet verebilmektedir.</li>
<li>Günün 24 saati ve haftalar boyu hiç kapatılmadan      çalışabilmektedir.</li>
<li>İşletim sistemi, veri erişim dilleri ve ağ      iletişim protokolleri standartlarıyla uyumludur.</li>
<li>Yetkisiz erişimleri engelleme ve kontrol      edebilme imkanı sağlamaktadır.</li>
<li>Bütünlüğü veritabanı düzeyinde      sağlayabilmektedir, böylece daha az kod yazılmaktadır.</li>
<li>İstemci/Sunucu mimarisinin bütün avantajlarını      kullanabilmektedir.</li>
</ul>
<p>Oracle ile ilk defa karşılaşan kullanıcılar genellikle Delphi, Visual Basic gibi görsel programlama dillerine benzeyen uygulamalarla karşılaşmayı umarlar. Oysa ki yukarıda da belirttiğimiz gibi Oracle bir ilişkisel veritabanı yönetim sistemidir. Yani bir programlama dili değildir. Fakat Oracle tarafından geliştirilen ve Oracle’ın kendi uygulama geliştirme araçları içerisinde kullanılan bir programlama dili (oracle forms)  vardır. Oracle ürünleri genellikle büyük çaplı veri kontrolünü gerektiren uygulamalarda kullanılır. Öncelikle bir ağda Oracle veritabanı sadece sunucu olarak adlandırılan bilgisayara yüklenir. Bu sunucu Oracle’ın desteklediği herhangi bir işletim sistemiyle çalışıyor olabilir. Yani Oracle’ın faklı işletim sistemleri için farklı sürümleri vardır. Bu sunucu bilgisayara kurulan veritabanı üzerinde tablolar, indeksler, eşanlamlar,tablo uzayları ve ihtiyaç duyulan kayıtlı prosedürler oluşturulur. Bunlar kendi diliyle <img src='http://www.ceturk.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  dersin sonraki bölümlerinde anlatılmaktadır. Oracle’ın bu veritabanına erişerek uygulama programı geliştirmeye yarayan diğer ürünleri de istemci bilgisayarlara kurulur. Tabi sunucu bilgisayara da isteğe bağlı olarak bu ürünler kurulabilir. Şimdi Oracle ürünlerini daha ayrıntılı olarak inceleyelim.</p>
<h2>Oracle Ürünleri</h2>
<p>Aşağıda şu an kullanımı en güncel olan değişik Oracle ürünleri tanıtılımıştır.</p>
<h3>Oracle RDBMS</h3>
<p>Oracle ilişkisel veritabanı yönetim sistemi Oracle şirketinin ana ürünüdür. Bu ürünün şu an en yeni sürümü 11g’dir. Biz bu çalışmada  Oracle8i’den itibaren ele alacagız.</p>
<p><strong>Oracle Uygulama Geliştirme Araçları</strong><strong> </strong></p>
<p>Oracle’ın veritabanı uygulamaları geliştirmek için görsel ürünleri bu grupta yer alır. Oracle’ın program geliştirmek için kullanılan bu ürünlerinin eski adı Oracle Power Objects idi. Daha sonra Oracle Developer 2000 ve sonra da Oracle Developer 6 ürünleri geliştirildi. Developer 2000 ve Developer 6 içerisinde Form Builder, Report Builder, Graphics Builder, Procedure Builder ve Schema Builder ürünlerini içerir. Form Builder kullanıcıya sunulacak arayüzlerin geliştirildiği programdır. İşte bu uygulama görsel bir programlama dilinin uygulama geliştirme ortamına benzer. Report Builder ürünü veritabanından elde edilen bilgiler ile raporlar hazırlamaya yarar. Özellikle banka ve kamu kuruluşlarının ihtiyacı olan fatura, evrak gibi belgelerin hazırlanıp, çıktı alınması için geliştirilmiş bir programdır. Procedure Builder sürekli kullanılacak kodların prosedürler halinde oluşturulup, kütüphaneler olarak kaydedilmesi işlemine yarayan bir programdır. Schema Builder ise veritabanı nesnelerinin görsel olarak oluşturulabilmesi için geliştirilmiş bir uygulamadır. Burada tablo, görüntü, eşanlam oluşturma, tablolar arası ilişki kurma,tablo kısıtlamaları oluşturma işlemleri görsel olarak yapılabilir.</p>
<h3>SQL*Plus ve PL/SQL</h3>
<p>SQL*Plus, Oracle veritabanında sorgulama yapmak ve SQL komutlarını çalıştırmak için kullanılan bir araçtır. SQL*Plus’da SQL komutlarının yanısıra PL/SQL komutları da kullanılabilmektedir. Bu çalışmanın diğer bölümlerinde anlatılan SQL komutları SQL*Plus kullanılarak hazırlanmıştır.</p>
<p>PL/SQL (Procedural Language/SQL), yapısal dillere ait özelliklerin standart SQL’e eklenmesiyle ortaya çıkan Oracle’a has bir dildir. PL/SQL Oracle firmasının piyasaya sürdüğü her üründe önemli bir yere sahiptir. Kullanıcılar PL/SQL’i kullanarak programlarına bir çok yeni özellikler katmaktadırlar. Bunlar arasında;</p>
<ul>
<li>PL/SQL tabanlı kaydedilmiş yordamlar(stored      procedures) ve veritabanı tetiklemeleri(triggers) ile önemli iş      kurallarını programlamak</li>
<li>Oracle Developer ürünleri ile güçlü ve kolay      kullanılabilir görsel ortamlarla programları detaylandırmak ve daha rahat      kontrol etmek</li>
<li>Oracle tabanlı uygulamalarda      nesne-tabanlı(object-oriented) tasarımlar yapma Web sayfalarından Oracle      veritabanlarına link yapma<strong> </strong></li>
</ul>
<p>PL/SQL’in belki de en önemli özelliği istemci-sunucu ortamları tasarlama ile ağ üzerinde dağıtık işlemler yapma ve bir çok sorguyu çalıştırma imkanı sunmasıdır. PL/SQL dili Ada dilinden sonra tasarlanmıştır. PL/SQL’de en gelişmiş yordamsal dillerde olan veri tipleri, blok yapısı, şartlara bağlı ve bağlı olmayan kontrol cümleleri, bir çok döngü tipi, hata durumlarında kullanılacak yordamlar ve kullanıcı tarafından tanımlanabilecek nesneler yer almaktadır.</p>
<h3>Net8</h3>
<p><strong> </strong>Net8 Oracle’ın bir ağ ürünüdür. Farklı bilgisayarların veritabanına bağlantı kurması ve ve istemci-sunucu arasında veri alışverişinin sağlanabilmesi Net8’in ana görevidir. Net8 ağdaki her bilgisayara kurulur. Ağ bağlantısı sağlandığında NET8 istemci ile sunucu arasında bir veri taşıyıcısı gibi işlem görür.</p>
<p>Ağ üzerinde bir istemcinin sunucudaki veritabanına erişebilmesi için, sunucuda bir ağ servis adının(Net Service Name) ve bir dinleyicinin(LISTENER) oluşturulması gerekir. Oracle Enterprise Edition ile birlikte gelen Net8 Assistant ile bu gerçekleştirilebilir. Ağ servis adları, veritabanı gibi bir servisi ağda tanımlamak amacıyla basit bir yöntem olarak kullanılır. Bir kullanıcı ağ servis adını kullanarak bağlantısını şöyle sağlar:</p>
<p>Connect kullanıcı_adı/şifre@ağ_servis_adı</p>
<p>Aşağıda Ne8 Assistant görüntüsü verilmiştir. Verilen şekilde ağ erişimi oluşturmak için gereken işlemler oldukça basittir. Bir ağ servis adı oluşturmak için “Ağ Servis Adları” dizininin üzerine gelip, yandaki artı işaretini tıklamak gerekir. Bundan sonra bazı bilgiler girmemiz istenir. Önce kullancağımız ağ servis adı bilgisi girilir, sonra iletişimde kullanılacak TCP/IP, SPX gibi protokollerden uygun olanın seçilmesi işlemi tamamlanır. Bundan sonra ana bilgisayar adı ve port numarası girilir. Ana bilgisayar adı veritabanının yüklü olduğu bilgisayarın adıdır. Port numarası ise Oracle’ın veritabanları için kullandığı standart numara olarak 1521 girilir. Bu işlemden sonra veritabanın sürümü seçilir ve veritabanı oluşturulurken girilen SID adı bilgisi verilir. Girilecek tüm bilgiler bu kadardır. Erişimin sağlanıp sağlanmadığını anlamak için “Test” butonu ile bağlantı denemesi yapılır. Ağ servis adları TNSNAMES.ORA adlı dosyaya haydedilir. Bu dosyada yaptığımız bir kayıt şu şekilde yer alır.</p>
<p>OGR =</p>
<p>(DESCRIPTION =</p>
<p>(ADDRESS_LIST =</p>
<p>(ADDRESS = (PROTOCOL = TCP)(HOST = bavenoglu)(PORT = 1521))</p>
<p>)</p>
<p>(CONNECT_DATA =</p>
<p>(SERVICE_NAME = ogr)</p>
<p>)  )</p>
<p>Ağ erişimi dinleyici(LISTENER) adı verilen bir yardımcı programla sağlanır. Net8 Assistant içerisinde bir dinleyici oluşturulabilir. Bir istemci sunucuya bağlanmak istediğinde bu isteği dinleyici karşılar ve istemcinin konfigürasyon bilgileri ile kendi bilgilerini karşılaştırır eğer uygunsa bağlantı sağlanır. Dinleyicinin konfigürasyonu ile ilgili bilgiler LISTENER.ORA dosyasında saklanır.</p>
<h3>SQL*Net</h3>
<p>SQL*Net Net8’in yardımcı programıdır. Bir istemci bilgisayara Oracle Forms ürününün yüklendiğini düşünelim. Bunun için istemci bilgisayar SQL*Net ile oluşturulan veritabanı takma adını(alias) kullanır. Yukarıda Net8 konfigürasyonunun istemci bilgisayarlarda da yapılması gerektiğini söylemiştik. İşte bu konfigürasyon istemci bilgisayarlarda SQL*Net sayesinde yapılır. Burada veritabanına verilecek takma isim, protokol adı, ana bilgisayar adı(veritabanının bulunduğu) ve veritabanının SID olarak girilen ismi bilgileri girilerek düzenleme yapılır.</p>
<p><strong>Şimdi genel hatları ile Oracle8i Enterprise Edition’ı kurulumunu inceleyelim.</strong></p>
<h2>Gerekli Donanım</h2>
<p>Oracle8<em>i </em>Enterprise Edition CD’sinde üç farklı ürün yer almaktadır:</p>
<ul>
<li>Oracle8<em>i </em>Enterprise Edition (Server)</li>
<li>Oracle8<em>i</em> Client</li>
<li>Oracle Programmer</li>
</ul>
<h3>Oracle8<em>i</em> Enterprise Edition(Windows NT)</h3>
<p><strong> </strong></p>
<table border="1" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td valign="bottom"><strong> </strong><strong>Yükleme   Türü</strong></td>
<td valign="bottom"><strong>Açıklama</strong></td>
</tr>
<tr>
<td valign="top">Typical</td>
<td valign="top">Tam anlamıyla bir veritabanı   kullanmak isteyenler için tavsiye edilen yükleme türüdür. Bir başlangıç   veritabanı, ağ servisleri, Oracle yardımcı ürünleri ve yardım dokümanları   yüklenir.720 MB yer kaplar. Pentium 133 ya da Pentium 166 işlemci ile   kurulabilir. Önerilen işlemci Pentium 200 dür. 96 MB RAM ile çalışabilir.   Tavsiye edilen bellek ise 128 MB ‘tır.</td>
</tr>
<tr>
<td valign="top">Minimal</td>
<td valign="top">Minimum veritabanı paketi   kullanmak isteyenler için önerilir. Bir başlangıç veritabanı, ağ servisleri   ve bazı yardımcı ürünleri içerir. 520 MB yer kaplar. Pentium 133 ya da   Pentium 166 işlemci ile kurulabilir. Önerilen işlemci Pentium 200 dür. 64 MB   RAM ile çalışabilir. Tavsiye edilen bellek ise 96 MB ‘tır.</td>
</tr>
</tbody>
</table>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<h3>Oracle8<em>i</em> Client(Windows NT ve Windows  )</h3>
<p><strong> </strong></p>
<table border="1" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td valign="bottom"><strong>Yükleme Türü</strong></td>
<td valign="bottom"><strong>Açıklama</strong></td>
</tr>
<tr>
<td valign="top">Typical</td>
<td valign="top">Veritabanı yöneticileri için   veritabanına bağlanma ve veritabanı yönetim işlerini gerçekleştirme   araçlarını yükler. 299 MB yer kaplar. Intel 80486 işlemci ile   çalıştırılabilir. Tavsiye edilen Pentium 133 ya da Pentium 166 dır. En az 32   MB RAM ile çalıştırılabilir. Önerilen 64 MB’tır.</td>
</tr>
</tbody>
</table>
<h3>Oracle Programmer(Windows NT ve Windows  )</h3>
<table border="1" cellspacing="0" cellpadding="0" width="100%">
<thead>
<tr>
<td valign="bottom"><strong>Yükleme Türü</strong></td>
<td valign="bottom"><strong>Açıklama</strong></td>
</tr>
<tr>
<td valign="top">Typical</td>
<td valign="top">Veritabanına erişebilen    geliştirme araçları ve ara yüzlerini yükler. Bu paket, ön    derleyicileri(precompilers), ağ servislerini ve yardım dokümanlarını    içerir. 267 MB yer kaplar. Intel 80486 işlemci ile çalıştırılabilir.    Tavsiye edilen Pentium 133 ya da Pentium 166 dır. En az 32 MB RAM ile    çalıştırılabilir. Önerilen 64 MB’tır.</td>
</tr>
</thead>
</table>
<h2>Oracle8i Enterprise Edition Kurulumu</h2>
<ol>
<li>Kuruluma başlamadan önce Windows NT sistemine “Administrator” olarak girin.</li>
</ol>
<ol>
<li>Eğer sistemde Oracle’ın daha önceki sürümleri      varsa StartàControl      PanelàServices      içerisinde tüm Oracle ile başlayan servisleri seçip, sağ tıklayın ve      açılan menüden “Stop” seçeneğini seçin.</li>
<li>CD-Rom’u takın ve otomatik olarak çalışmasını      bekleyin. Eğer çalışmazsa cd-rom sürücü dizinine geçip Setup.Exe dosyasını      çalıştırın.</li>
<li>Şimdi “Oracle Universal Installer“ olarak      adlandırılan ürün yükleme sihirbazının çalışmış olması gerekir. Bu ana      pencerede “Install/Deinstall Products” seçeneğini tıklayın.</li>
<li>İlk karşınıza gelen tanıtım penceresidir. Burada      daha önce yüklenmiş ürünlerin listesi görülebilir. Yeni yükleme için      “İleri” butonunu tıklayın.</li>
<li>“Dosya Yerleşimleri” penceresinde kaynak ve      hedef dizin ve dosya adları belirtilir. Kaynak dizin E:\STAGE\PRODUCTS.JAR      şeklinde otomatik olarak belirtilir. Bu dizin adı değiştirilmemelidir.</li>
<li>Hedef olarak bir Oracle giriş dizini adı ve yolu      girmeniz beklenir. Otomatik olarak giriş dizini adı için “OraHome81” ve      yolu içinde  “C:\Oracle\Ora81”      belirtilir. Bu alanlar değiştirilmeden “İleri” butonu tıklanabilir.</li>
</ol>
<ol>
<li>Ürün bilgileri listesinin yüklenmekte olduğunu belirten bir pencere geldikten sonra karşınıza “Yüklenebilecek Ürünler” penceresi gelir. Yukarıda da anlattığımız gibi burada üç ürün vardır. Oracle8i Enterprise Edition seçeneğini işaretleyerek “İleri” butonuna basın.</li>
</ol>
<ol>
<li>“Yükleme Türleri” penceresinde tipik, minimum ya      da özel seçeneklerinden biri seçilerek “İleri” butonuna basılır.</li>
<li>Eğer tipik yükleme, ya da özel yükleme      seçildiyse burada Oracle yardım dosyalarını diskten ya da CD-Rom’dan      çalıştırma seçeneklerinden birini seçmeniz beklenir. Eğer diskte yaklaşık      133MB boş yeriniz varsa diske yükleme seçeneğini seçebilirsiniz.</li>
<li>Bilgisayarınızda daha önceden yüklü bir Oracle      veritabanı varsa bu kısımda bunu güncellemek isteyip istemediğinizi soran      bir pencere gelir. “Migrate an Existing Database”      kutusunu işaretlerseniz yüklemeden hemen sonra “Oracle Data Migration      Assistant” programı çalışır ve eski veritabanınızı yeni sürüme terfi      ettirir.</li>
<li>“İleri” butonunu tıkladığınızda karşınıza “Database Identification” penceresi gelir.      Burada  “Global Database Name” ve “SID” alanlarını doldurmanız      istenir. Buraya vereceğiniz isim veritabanının adı olacaktır. Bu      alanlardan birini doldurduğunuzda diğeri de aynı değeri otomatik olarak      alır.</li>
</ol>
<ol>
<li>“İleri” butonunu tıkladığınızda genel ayarlar,      ürün dilleri, alan gereksinimleri ve yeni yüklenecek ürünleri kapsayan bir      liste gelir. Listede değişiklik yapılamaz. Sadece bildiri amaçlı bir      listedir.</li>
<li>“İleri” butonunu tıkladığınızda ürünler      yüklenmeye başlar. Oracle8i Enterprise Edition sürümünün tipik olarak      yüklenmesi minimum donanım ayarlarında yaklaşık yarım saat sürer.</li>
<li>Dosyaların kopyalanması bittikten sonra      “Konfigürasyon Penceresi” gelir.Veritabanının oluşturulması, başlatılması      ve ağ ayarlarının yapılması burada otomatik olarak yapılır. Veritabanı      oluşturma işlemleri bittikten sonra karşınıza giriş şifrelerinin ve      veritabanı ile ilgili bazı bilgilerin verildiği bir pencere gelir.      Buradaki şifreler daha sonra veritabanı yönetimi için kullanılacak      şifreler olduğundan, önemlidir.</li>
</ol>
<ol>
<li>Bu işlemler tamamlandıktan sonra “Universal      Installer” kapatılabilir.</li>
</ol>
<h2>Oracle8i Enterprise Edition Ürününü Kaldırma</h2>
<ol>
<li>Bu ürünü kaldırmadan önce StartàControl      PanelàServices      seçilerek çalışan tüm Oracle servisleri kapatılmalıdır.(“Oracle” kelimesi      ile başlayan tüm servisler)</li>
<li>“Start &gt; Programs &gt; Oracle Installation      Products &gt; Universal Installer” seçilerek yükleme asistanı      çalıştırılmalıdır.</li>
<li>Burada “Yüklü Ürünler” butonu tıklanır.</li>
<li>Kaldırmak istenilen ürünlerin solundaki kutular      tıklanarak boşaltılır ve “Kaldır” butonuna basılır.</li>
<li>Ekrana bu kaldırılacak ürünlerin listesi gelir      ve kaldırmak için son kez onay istenir.</li>
</ol>
<p>“Evet” butonuna tıklanırsa seçili ürünler kaldırılır. Sonra “Universal Installer” kapatılabilir</p>
<p>Hayrullah AYAN</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ceturk.com/oracle-veritabanina-kusbakisi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<enclosure url="http://www.ceturk.com/images/oracle-logo.gif" length="5831" type="image/jpg" />	</item>
		<item>
		<title>Hayrullah Ayan Kimdir?</title>
		<link>http://www.ceturk.com/hayrullah-ayan-kimdir/</link>
		<comments>http://www.ceturk.com/hayrullah-ayan-kimdir/#comments</comments>
		<pubDate>Sat, 31 Oct 2009 14:03:19 +0000</pubDate>
		<dc:creator>Yönetici</dc:creator>
				<category><![CDATA[Biyografi]]></category>
		<category><![CDATA[Ceturk Ekibi]]></category>
		<category><![CDATA[Erciyes Üniversitesi]]></category>
		<category><![CDATA[Erciyes Üniversitesi Bilgisayar Mühendisliği]]></category>
		<category><![CDATA[Hayrullah Ayan]]></category>

		<guid isPermaLink="false">http://www.ceturk.com/?p=3363</guid>
		<description><![CDATA[Hayrullah Ayan 1983 Konya doğumlu olup, Erciyes Üniversitesi Bilgisayar Mühendisliği’nden (2006 Şubat) mezun oldu. Bir buçuk yıl özel bir şirkette çalıştıktan sonra iki yıl Bank Asya Yazılım Geliştirme Bölümünde Yazılım Mühendisi olarak çalıştı. Haziran 2009’dan itibaren Akbank Bilgi Teknolojileri Uygulama Geliştirme bölümünde outsource olarak çalışmaktadır. Askerlik görevini tamamlamış olup 2008 yılında evlenmiştir. Fatih Üniversitesi MBA [...]]]></description>
			<content:encoded><![CDATA[<h2>Hayrullah Ayan</h2>
<p><a href="http://www.ceturk.com/etiket/hayrullah-ayan"><img title="Hayrullah Ayan" src="http://www.ceturk.com/images/hayrullah-ayan.jpg" alt="Hayrullah Ayan" width="300" height="292" /></a></p>
<p><strong>1983 Konya</strong> doğumlu olup, <strong>Erciyes Üniversitesi Bilgisayar Mühendisliği</strong>’nden (2006 Şubat) mezun oldu. <span id="more-3363"></span>Bir buçuk yıl özel bir şirkette çalıştıktan sonra iki yıl <strong>Bank Asya Yazılım Geliştirme Bölümü</strong>nde <strong>Yazılım Mühendisi</strong> olarak çalıştı. Haziran 2009’dan itibaren <strong>Akbank Bilgi Teknolojileri Uygulama Geliştirme</strong> bölümünde outsource olarak çalışmaktadır.<br />
Askerlik görevini tamamlamış olup 2008 yılında evlenmiştir.<strong> Fatih Üniversitesi MBA</strong> programında yüksek lisansına devam etmektedir.</p>
<p>Oracle , PL/SQL,C#,.Net bilgisinin yanı sıra Cobol Mainframe ve DB2  ile ilgili çalışmaları mevcuttur.</p>
<p>CETURK Ekibi&#8217;nde<a href="http://www.ceturk.com/forum/cobol/"> COBOL Forum</a> Sorumlusu olarak görev yapmaktadır.<br />
CETURK&#8217;teki  yazılarına erişmek için : <a href="http://www.ceturk.com/etiket/hayrullah-ayan">http://www.ceturk.com/etiket/hayrullah-ayan</a><br />
CETUK Forumu&#8217;undaki profiline erişmek için : <a href="http://www.ceturk.com/forum/uyeler/hayrullah-ayan/">http://www.ceturk.com/forum/uyeler/hayrullah-ayan/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ceturk.com/hayrullah-ayan-kimdir/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<enclosure url="http://www.ceturk.com/images/hayrullah-ayan.jpg" length="10937" type="image/jpg" />	</item>
	</channel>
</rss>

