Oracle da veritabanı dosyaları
Data File SYSAUX.DBF & SYSTEM.DBF
Redo Log File UNDO.DBF
Control File CONTROL.DBF
Data File Verileri içerir Oracle üzerinde sınırsız sayıda Data File oluşturulabilir.
Redo Log File veri üzerinde yapılan her değişiklik bu dosya içinde log lanırlar.
Herhangi bir crash anında sistemi ve bozulan dosyayı otomatik olarak toplamak için kullanılır.
Control File Veri tabanlari ile ilgili data harici bilgilerin ve istatistiklerin tutulduğu dosya.
Oracle XE :
Oraclein kontrol araci http://127.0.0.1:8080/apex
Sistem Yöneticisi Kullanıcı İsimleri system , sys , sysman
Şifre başlangıçda atanan şifre
TableSpace Oracle da bir veritabanı adına Tablespace denilen mantıksal alanlara bölünür. Tablespace içerisinde bir ilişki olan olan veritabanı yapıları barındırır. Online, Offline, Read Only & One User olabilirler.
Sequence tabloların numerik alanlari için seriler üretir. Sequence tablodan bağımsız olduğu için ürettiği değeri birden fazla tabloda kullanmak mümkündür.
Synonym gerçek bir nesne değildir. Varolan nesnelere alias sağlar.
Veri Türleri :
Character char , varchar2 , nvarchar2
char sabit büyüklüklü karakter veri alanı (2000 byte)
char(50) “sedat” , 45 adet boşluk karakteri ekler.
varchar2 değişken büyüklüklü karakter veri alanı (4000 byte)
nvarchar2 4000 byte , Unicode karakter tipi
Sayısal Veri Türleri è
number hem integer hem de reel sayılar için veri tipi
number(x,y) x : hane sayisi , y : virgulden sonraki alan sayisi
number(4,2) 14,12
Number in maximum boyutu 10^130(Express için)
binary_float & binary_double binary float direk olarak byte formatında işlenip saklanır. Buda matematik işlemlerinin daha hızlı yapılmasını sağlar.
LOB(Large Object) veri türleri
BLOB Binary large object
CLOB cumilative large object
binary formatında data tutarlar.
BLOB un max boyutu 8TB
CLOB un max boyutu 128TB
Zaman veri türleri
Date sadece tarih
Timestamp tarih + saat
Constaints (Kısıtlamalar)
Default Value => bir sutuna varsayılan değer ataması yapilabilir.
Not null => sutunun boş bırakılmamasını sağlar
Unique => sutunun benzersiz olmasını sağlar
Check => sutun uzerine boolean bir koşul atanmasını sağlar. Bu koşul insert & update lerde çalışır.
Primary key
Foreign key disallow delete , Cascade Delete , Set Null on Delete
CREATE SEQUENCE "DENEME_SEQ" MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE
/
Her sequence in 2 adet alt değişkeni vardır.
CURRVAL o andaki değeri
NEXTVAL bir sonraki değeri.
CREATE TABLE "DENEME" (
"NO" NUMBER(18,0) NOT NULL ENABLE,
"ISIM" VARCHAR2(100),
"SOYISIM" VARCHAR2(100),
"GTARIHI" DATE,
CONSTRAINT "DENEME_PK" PRIMARY KEY("NO") ENABLE
)
/
CREATE OR REPLACE TRIGGER "BI_DENEME"
before insert on "DENEME"
for each row
begin
select "DENEME_SEQ".nextval into :NEW.NO from dual;
end;
/
ALTER TRIGGER "BI_DENEME" ENABLE
/
TEMEL ORACLE SQL KOMUTLARI
select country_name "Ülke İsmi" from countries
(sütuna alias tanımlama)
Where ifadesinde kullanılan koşullar :
< , > ,>= ,<= , != , =
between .. and ..
like
in (x,y,z) / not in(x,y,z)
is null / is not null
farklı olanlar : regexp_ınstr
regexp_LIKE
regexp_REPLACE
regexp_SUBSTR
REGEXP => regular expression
select * from employees
where regexp_like(email, '\w{6}' ,'i')
(email değeri en az 6 haneli olanlar.)
REGEX => \w (alphanumeric karakter)
regexp_like belirtilen koşul kelime içinde geçenleri getirir.
select phone_number ,
regexp_replace(phone_number, '(.{3})\.(.{3})\.(.{4})' , '(\1) \2-\3' )
from employees
‘(.{3})\.(.{3})\.(.{4})’ => 3 adet parantez bolgesi
. her hangi bir karakter anlamına gelir.
(.{3}) => birinci bolgede 3 karakter vardir.
\. => . anlamina gelir.
PSEUDOCOLUMNS
sistemi yoneten dual tablosundan elde edilebilecek değerleri temsil ederler.
select sysdate from dual
SYSDATE
02/05/2009
select user from dual
select ROWNUM,JOB_ID,JOB_TITLE from jobs
Sayfalamak için =>
select JOB_ID,JOB_TITLE from jobs where rownum between 1 and 5
****
select t.satir,t.job_title from (select rownum as satir , job_title from jobs) t where satir between 2 and 5;
JOIN ler
Natural join , Normal join , Inner Join , Outer join
Natural Join select first_name,last_name,DEPARTMENT_NAME
from employees natural join departments;
(natural join de on ifadesi vede sütun ismi belirtilmez)
(sistem iki tablodaki aynı isimdeki sutunlara göre otomatik olarak iner join yapar.)
select first_name,last_name,DEPARTMENT_NAME
from employees natural join departments;
Driver lar
Java için … C:\oraclexe\app\oracle\product\10.2.0\server\jdbc\lib
.NET İçin…. C:\oraclexe\app\oracle\product\10.2.0\server\BIN
klasörü altinda oraclient10.dll
Fonksiyonlar :
Aggregate functionlar
** select employee_id,first_name,last_name,salary,
rank() over (order by salary desc) from employees
Salary e göre tersten dizer ve numara verir.
Not : 1 , 2 , 2 , 2 , 5 , 6…. Şeklinde gider.
** select employee_id,first_name,last_name,salary,
dense_rank() over (order by salary desc) from employees
Not : 1 , 2 , 2 , 3 , 4 , 4 , 5 şeklinde gider.
** select rank(15000) within group (order by salary desc) from employees
15000 maaş sıralamasında kaçıncı sırada yer alır.
Not : select rank(:maas) within group (order by salary desc) from employees
Parametreli sorgular parametre ismi (:maas) oracle senden bu değeri kesin ister…
System View leri
System yada sysaux tablespace için login olduktan sonra
Kullanılabilecek olan view lar. Oracle da yönetimsel view lar v$ işareti ile başlar.
System ile login olun.
v$datafile veri dosyaları hakkında temel bilgileri gösterir.
v$session veritabanı üzerinde bulunan tüm sessionlari kullanıcıya gösterir.
v$process o anda yapılan işlemlerin listesi
v$instance oracle.exe nin anlık çalışma durumunu bildirir.
//ORACLE in Web PORTUNU Değiştirmek…
begin
dbms_xdb.sethttpport('8090');
end;
PL/SQL :
Oracle standart kendi içerisinde 2 adet dil barındırır.
SQL (temel sql standartdı ki sql dilini standartlaştıran firma Oracle dir.)
PL/SQL procedural language for SQL
a. Pl/SQL in SQL ile hiçbir alakası yoktur.
b. PL/SQL dili standart sql komutları üzerine programlama yapmak için geliştirilmiş olan script dilidir.
c. PL/SQL standart bir procedurel language in barındırdırdığı tüm özellikleri barındırır.
d. Değişkenler , karar yapıları , döngüler , try-catch , exception lar,function , procedure , stored procedure , advanced cursor lar
Temel PL/SQL kod bloğu…
Declare
…………. (değişken tanımları)
Begin
………… (sql ifadeleri)
End;
/
Declare
x number(8);
Begin
x := 5;
dbms_output.put_line( 'Sayisal Değer ' || To_Char(x) );
End;
declare
satir employees%ROWTYPE;
begin
select * into satir from employees where employee_id = 101;
dbms_output.put_line(satir.first_name || ' ' || satir.last_name);
end;
%ROWTYPE (Generic Type) belirtilen tablodaki bir satıra karşılık gelir.
TYPE (Generic Type) belirtilen sutundaki veri turunu otomatik olarak alir.
declare
satir employees%ROWTYPE;
isim employees.first_name%TYPE;
soyisim employees.last_name%TYPE;
begin
select * into satir from employees where employee_id = 101;
isim := satir.first_name;
soyisim := satir.last_name;
dbms_output.put_line(isim || ' ' || soyisim);
end;
Karar Yapıları
DECLARE
girisTarihi DATE;
satir employees%ROWTYPE;
ikramiye number(8);
BEGIN
select * into satir from employees where employee_id = :eid;
girisTarihi := satir.HIRE_DATE;
IF girisTarihi > TO_DATE('1.1.1999') THEN
ikramiye := 1000;
ELSIF girisTarihi > TO_DATE('1.1.2001') THEN
ikramiye := 500;
ELSE
ikramiye := 100;
END IF;
dbms_output.put_line('Toplam Maas : ' || TO_CHAR( satir.salary + ikramiye ) );
END;
DECLARE
girisTarihi DATE;
satir employees%ROWTYPE;
ikramiye number(8);
BEGIN
select * into satir from employees where employee_id = :eid;
girisTarihi := satir.HIRE_DATE;
CASE
WHEN girisTarihi > TO_DATE('1.1.1999') THEN
ikramiye := 1000;
WHEN girisTarihi > TO_DATE('1.1.1999') THEN
ikramiye := 500;
ELSE
ikramiye := 100;
END CASE;
dbms_output.put_line('Toplam Maas : ' || TO_CHAR( satir.salary + ikramiye ) );
END;
DÖNGÜLER :
FOR Döngüsü kendisini bir index e bağlar ve de bu index değişimlerinde
çalışır.
BEGIN
--for(int i=0;i<10;i++){} //C Tabanlı dillerde kullanılan for döngüsü
FOR i IN 1..10 LOOP
dbms_output.put_line('Sayi : ' || i);
END LOOP;
END;
WHILE Döngüsü while döngüsünün çalışması bir koşula bağlanmıştır.
Koşul doğru olduğu sürece while çalışır. Koşul False ise while durur.
DECLARE
i number := 1;
BEGIN
WHILE i<=10 LOOP
dbms_output.put_line('SAYI : ' || to_char(i));
i := i + 1;
END LOOP;
END;
SONSUZ Döngü : oracle da bulunan sonsuz döngülerin bitişi içerisine yazılan bir exit ifadesi ile mümkündür. Döngü exit ifadesine rastlamaz ise işlem onu gelmez…
DECLARE
i number := 1;
BEGIN
LOOP
dbms_output.put_line('SAYI : ' || to_char(i));
i := i + 1;
EXIT WHEN i > 10;
END LOOP;
END;
GOTO : goto standart da kodun çalışmasını sizin belirlemiş olduğunuz
Bir satira transfer eder. Bu özelliği ile döngü yada if-else ibaresi gibi kullanılabilir.
DECLARE
i number := 1;
BEGIN
<
dbms_output.put_line('SAYI : ' || to_char(i));
i := i + 1;
if i <= 10 then
GOTO baslangic;
end if;
END;
PROCEDURE :
Procedure kendi görevi ve parametreleri olan program bloğudur. Function lardan farklı olarak Procedure ler değer üretmezler. (void fonksiyonlar)
Procedure ler parametre alabilirler. Aldiklari parametreler IN , OUT yada IN OUT şeklinde tanımlanabilir.
IN input (procedure e değer yollar)
OUT procedure den değer çıkarmak için kullanılır.
IN OUT yolladığın değişkenin üzerinde yapılan değişiklikler orijinal programa yansıtılır. (değişken değeri yollar ve yeni üretileni dışarı çıkartır.)
DECLARE
satir employees%ROWTYPE;
isim employees.first_name%TYPE;
soyisim employees.last_name%TYPE;
maas employees.salary%TYPE;
-- procedure ler DECLARE ifadesi içinde tanımlanırlar.
PROCEDURE ZamliMaas( p1 IN OUT employees.salary%TYPE) AS
BEGIN
p1 := p1 * 1.40;
END ZamliMaas;
BEGIN
select * into satir from employees where employee_id = :empid;
maas := satir.salary;
isim := satir.first_name;
soyisim := satir.last_name;
ZamliMaas(maas);
DBMS_OUTPUT.PUT_LINE(isim || soyisim || ' in yeni maasi : ' || maas);
END;
FUNCTION : Belli bir görevi olan kod bloklarıdır. Aldıkları paramaetreler IN,OUT yada IN OUT şeklinde tanımlanmak zorundadır. Procedure lerden farklı olarak belli bir RETURN TYPE barındırırlar. (return type i olan fonksiyonlara denk gelirler)
DECLARE
satir employees%ROWTYPE;
maas number;
-- Her Function in bir RETURN TYPE i olmak zorunda
FUNCTION ZamliMaas( p1 IN number ) RETURN number AS
sonuc number; -- fonksiyonun kendi içindeki değişken
BEGIN
sonuc := p1 * 1.40;
RETURN Sonuc; -- her function in RETURN ifadesi olacak
END ZamliMaas;
BEGIN
select * into satir from employees where employee_id = :empid;
maas := satir.salary;
DBMS_OUTPUT.PUT_LINE('Yeni Maasi : ' || ZamliMaas(maas));
END;
CURSOR :
Cursor bir SQL Sorgunun ürettiği cevaplar üzerinde haraket ve modifikasyon yeteneği sağlayan özel bir SQL alanıdır.
SQL Veritabanları içerisinde otomatik yada kullanıcı tarafından oluşturulan bir pointer dir.
Java da bulunan ResultSet vede .NET de bulunan Reader ifadeleri database ler üzerinde oluştudukları Cursor lar ile haraket kabiliyeti sağlar.
DECLARE
-- Cursor Definition
CURSOR c1 IS select first_name,last_name from employees;
isim employees.first_name%TYPE;
soyisim employees.last_name%TYPE;
BEGIN
OPEN c1; --Cursor u Aç
LOOP
FETCH c1 INTO isim,soyisim; --CURSOR u ileri al.
EXIT WHEN c1%NOTFOUND; --NOTFOUND cursor un cevap getiremediğini iletir.
DBMS_OUTPUT.PUT_LINE('Eleman İsmi ' || isim || soyisim );
END LOOP;
DBMS_OUTPUT.PUT_LINE('İşlenen Eleman Sayısı : ' || TO_CHAR(c1%ROWCOUNT) );
-- ROWCOUNT ==> Cursor un Fetch ettiği Satır Sayısı
CLOSE c1; --CURSOR u kapat
END;
NOT 1 :
select EXTRACT(MONTH FROM hire_date) "Giriş Ayı" FROM Employees
è Date olarak belirtilen bir alandan tarihin belli bir parçasını almak için kullanılan fonksiyon…
NOT 2 :
select last_name from employees where last_name like q'%'%'
q => baştaki ve sondaki ‘’ a bakar aradaki özel karakterleri atlar.
Parametreli Cursor : Cursor un Fonksiyon gibi Davranmasını sağlar.
Örnek : içinde bulunduğumuz ay içerisinde işe girenlerin maaşları toplamı
DECLARE
toplam NUMBER:= 0;
satir employees%ROWTYPE;
CURSOR c1 (buay NUMBER) IS
select * from employees WHERE EXTRACT(MONTH FROM hire_date) = buay;
BEGIN
--Cursor u açarken parametreyi vermek zorundasınız.
OPEN c1( EXTRACT(MONTH FROM SYSDATE) );
LOOP
FETCH c1 INTO satir;
EXIT WHEN c1%NOTFOUND;
toplam := toplam + satir.salary;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Bu Ay işe girenlere verilen toplam para ' || toplam);
END;
CREATE TABLE sinif (
sinifid number(8,0) not null,
sinifisim varchar2(50),
kontenjan number(8,0)
);
/
CREATE TABLE ogrenci(
ogrenciid number(8,0) not null,
ogrenciisim varchar2(50),
sinifid number(8,0)
);
/
insert into sinif values(1,'A1',5);
/
insert into sinif values(2,'A2',5);
/
insert into sinif values(3,'A3',5);
/
insert into ogrenci values(1,'ogr1',1);
/
insert into ogrenci values(2,'ogr2',1);
insert into ogrenci values(3,'ogr3',1);
insert into ogrenci values(4,'ogr4',1);
insert into ogrenci values(5,'ogr5',1);
insert into ogrenci values(6,'ogr6',2);
insert into ogrenci values(7,'ogr7',2);
insert into ogrenci values(8,'ogr8',2);
insert into ogrenci values(9,'ogr9',3);
SORU : Yukarıdaki tabloda A1 deki öğrencileri dengeyi bozmadan
A2 ve de A3 e eklemek için gereken PL/SQL Komutunu yazınız.
DECLARE
CURSOR c1(s number) IS select * from ogrenci where sinifid = s;
satir ogrenci%ROWTYPE;
sid number;
BEGIN
OPEN c1(1);
LOOP
FETCH c1 into satir;
EXIT WHEN c1%NOTFOUND;
select sinifid into sid FROM
(select t.sinifid,rownum satir FROM
(select sinifid from ogrenci where sinifid<>satir.sinifid
group by sinifid order by count(*)) t)
WHERE ROWNUM = 1;
UPDATE ogrenci SET sinifid = sid where ogrenciid = satir.ogrenciid;
COMMIT;
END LOOP;
CLOSE c1;
END;