Oracle PL/SQL Tutorial  / Dual

Dual tablosu tek bir satır içerir. Dual tablosu içinde varchar2 tipinde dummy olarak isimlendirilen tek bir kolon vardır. Dual tablosu içinde X değeri tek bir satır içerir.

DESCRIBE dual;

Name         Null?    Type
DUMMY                 VARCHAR2(1)
SELECT * FROM dual;
Dual tablosu kullanılarak basit hesaplamalara yapılabilir
select 123 * 456 from dual;
select sysdate from dual;
select to_char(to_date ('07/09/2017','dd/mm/yyyy'),'yyyymm') as tarih from  dual;
select to_char (sysdate,'mm') as tarih from  dual;

Oracle PL/SQL Tutorial  / Arithmetic Operator

Sql dilinde aritmetik operatörler öncelik sırasına göre kullanılır. Öncelikler çarpma ve bölme daha sonra toplama ve çıkarma yapılır. Eğer operatörler aynı önceliğe sahipse, soldan sağa doğru ilk rakamdan başlanır.

SELECT 10 * 12 / 3 - 1 FROM dual;
  • Parantezli işlemler varsa ilk olarak parantez içinde ki aritmetik operatörler ile ilgili işlem yapılır.
SELECT 10 * (12 / 3 - 1) FROM dual;

Oracle PL/SQL Tutorial  / Comparison Operators

Where ifadesi altında birçok karşılaştırma operatörü kullanılabilir.

Operator Description

= Equal
<> or != Not equal
< Less than
> Greater than
<= Less than or equal
>= Greater than or equal
ANY Compares one value with any value in a list
ALL Compares one value with all values in a list

 

Operatörler için örneklere başlamadan önce örnek bir tablo tasarlayıp. İçerisine data ekleyelim.

create table Employee(
ID                 VARCHAR2(4 BYTE)         NOT NULL,
First_Name         VARCHAR2(10 BYTE),
Last_Name          VARCHAR2(10 BYTE),
Start_Date         DATE,
End_Date           DATE,
Salary             Number(8,2),
City               VARCHAR2(10 BYTE),
Description        VARCHAR2(15 BYTE));



insert into Employee(ID,  First_Name, Last_Name, Start_Date,End_Date,Salary, City, Description)
values ('01','Jason',    'Martin',  to_date('19960725','YYYYMMDD'), to_date('20060725','YYYYMMDD'), 1234.56, 'Toronto',  'Programmer');
insert into Employee(ID,  First_Name, Last_Name, Start_Date,End_Date,Salary, City, Description)
values('02','Alison',   'Mathews', to_date('19760321','YYYYMMDD'), to_date('19860221','YYYYMMDD'), 6661.78, 'Vancouver','Tester');
insert into Employee(ID,  First_Name, Last_Name, Start_Date,End_Date,Salary, City, Description)
values('03','James',    'Smith',   to_date('19781212','YYYYMMDD'), to_date('19900315','YYYYMMDD'), 6544.78, 'Vancouver','Tester');
insert into Employee(ID,  First_Name, Last_Name, Start_Date,End_Date,Salary, City, Description)
values('04','Celia',    'Rice',    to_date('19821024','YYYYMMDD'), to_date('19990421','YYYYMMDD'), 2344.78, 'Vancouver','Manager');
insert into Employee(ID,  First_Name, Last_Name, Start_Date,End_Date,Salary, City, Description)
values('05','Robert',   'Black',   to_date('19840115','YYYYMMDD'), to_date('19980808','YYYYMMDD'), 2334.78, 'Vancouver','Tester');
insert into Employee(ID,  First_Name, Last_Name, Start_Date,End_Date,Salary, City, Description)
values('06','Linda',    'Green',   to_date('19870730','YYYYMMDD'), to_date('19960104','YYYYMMDD'), 4322.78,'New York',  'Tester');
insert into Employee(ID,  First_Name, Last_Name, Start_Date,End_Date,Salary, City, Description)
values('07','David',    'Larry',   to_date('19901231','YYYYMMDD'), to_date('19980212','YYYYMMDD'), 7897.78,'New York',  'Manager');
insert into Employee(ID,  First_Name, Last_Name, Start_Date,End_Date,Salary, City, Description)
values('08','James',    'Cat',     to_date('19960917','YYYYMMDD'), to_date('20020415','YYYYMMDD'), 1232.78,'Vancouver', 'Tester');

select * from Employee;


ID   FIRST_NAME LAST_NAME  START_DAT END_DATE      SALARY CITY       DESCRIPTION
---- ---------- ---------- --------- --------- ---------- ---------- ---------------
01   Jason      Martin     25-JUL-96 25-JUL-06    1234.56 Toronto    Programmer
02   Alison     Mathews    21-MAR-76 21-FEB-86    6661.78 Vancouver  Tester
03   James      Smith      12-DEC-78 15-MAR-90    6544.78 Vancouver  Tester
04   Celia      Rice       24-OCT-82 21-APR-99    2344.78 Vancouver  Manager
05   Robert     Black      15-JAN-84 08-AUG-98    2334.78 Vancouver  Tester
06   Linda      Green      30-JUL-87 04-JAN-96    4322.78 New York   Tester
07   David      Larry      31-DEC-90 12-FEB-98    7897.78 New York   Manager
08   James      Cat        17-SEP-96 15-APR-02    1232.78 Vancouver  Tester
  • Where ifadesi altında not equal (<>) operatörünün kullanımı
SELECT * FROM employee WHERE id <> 2;

ID   FIRST_NAME LAST_NAME  START_DAT END_DATE      SALARY CITY       DESCRIPTION
---- ---------- ---------- --------- --------- ---------- ---------- ---------------
01   Jason      Martin     25-JUL-96 25-JUL-06    1234.56 Toronto    Programmer
03   James      Smith      12-DEC-78 15-MAR-90    6544.78 Vancouver  Tester
04   Celia      Rice       24-OCT-82 21-APR-99    2344.78 Vancouver  Manager
05   Robert     Black      15-JAN-84 08-AUG-98    2334.78 Vancouver  Tester
06   Linda      Green      30-JUL-87 04-JAN-96    4322.78 New York   Tester
07   David      Larry      31-DEC-90 12-FEB-98    7897.78 New York   Manager
08   James      Cat        17-SEP-96 15-APR-02    1232.78 Vancouver  Tester
  • Where ifadesi altında büyüktür (>)operatörünün kullanımı
SELECT id, first_name FROM employee WHERE id > 3;

ID   FIRST_NAME
---- ----------
04   Celia
05   Robert
06   Linda
07   David
08   James
  • Where ifadesi altında küçük ve eşit (<=)operatörünün kullanımı
select id, first_name from employee where id <= 3;
ID   FIRST_NAME
---- ----------
01   Jason
02   Alison
03   James

Oracle PL/SQL Tutorial  / Logical Operators

Where ifadesi altında 3 adet mantıksal operatör kullnılabilir. Mantıksal operatörler satırları koşul verilerek sınırlamayı sağlar.

Mantıksal Operatörler:

·         Returns true when both x and y are true
·         Returns true when both x or y are true
 ·  NOT x Returns true if x is false, and returns false if x is true

 

  • And mantıksal operatörü ile satırları getirmek.
SELECT * FROM employee  WHERE start_date > '01-JAN-1970' AND id > 3;

ID   FIRST_NAME           LAST_NAME            START_DAT END_DATE      SALARY CITY       DESCRIPTION
---- -------------------- -------------------- --------- --------- ---------- ---------- ---------------
04   Celia                Rice                 24-OCT-82 21-APR-99    2344.78 Vancouver  Manager
05   Robert               Black                15-JAN-84 08-AUG-98    2334.78 Vancouver  Tester
06   Linda                Green                30-JUL-87 04-JAN-96    4322.78 New York   Tester
07   David                Larry                31-DEC-90 12-FEB-98    7897.78 New York   Manager
08   James                Cat                  17-SEP-96 15-APR-02    1232.78 Vancouver  Tester
  • Or mantıksal operatörü ile satırları getirmek.
SELECT * FROM employee  WHERE start_date > '01-JAN-1970' OR id > 3;

ID   FIRST_NAME           LAST_NAME            START_DAT END_DATE      SALARY CITY       DESCRIPTION
---- -------------------- -------------------- --------- --------- ---------- ---------- ---------------
01   Jason                Martin               25-JUL-96 25-JUL-06    1234.56 Toronto    Programmer
02   Alison               Mathews              21-MAR-76 21-FEB-86    6661.78 Vancouver  Tester
03   James                Smith                12-DEC-78 15-MAR-90    6544.78 Vancouver  Tester
04   Celia                Rice                 24-OCT-82 21-APR-99    2344.78 Vancouver  Manager
05   Robert               Black                15-JAN-84 08-AUG-98    2334.78 Vancouver  Tester
06   Linda                Green                30-JUL-87 04-JAN-96    4322.78 New York   Tester
07   David                Larry                31-DEC-90 12-FEB-98    7897.78 New York   Manager
08   James                Cat                  17-SEP-96 15-APR-02    1232.78 Vancouver  Tester
  • Not mantıksal operatörü ile satırları getirmek.
SELECT * FROM employee  WHERE not(start_date > '01-JAN-1970');
SELECT * FROM employee  WHERE id not in  (3,4,5);
ID FIRST_NAME LAST_NAME START_DATE END_DATE SALARY CITY DESCRIPTION
01 Jason Martin 07.25.1996 00:00:00 07.25.2006 00:00:00 1.235 Toronto Programmer
02 Alison Mathews 03.21.1976 00:00:00 02.21.1986 00:00:00 6.662 Vancouver Tester
06 Linda Green 07.30.1987 00:00:00 01.04.1996 00:00:00 4.323 New York Tester
07 David Larry 12.31.1990 00:00:00 02.12.1998 00:00:00 7.898 New York Manager
08 James Cat 09.17.1996 00:00:00 04.15.2002 00:00:00 1.233 Vancouver Tester

Oracle PL/SQL Tutorial  / Null Values

 

  • Veritabanında ki boş değerler bilinmeyen değerler olarak bilinir.
  • Boş değerler bir karakter içermezle.
  • Boş bir değer sütunun değerinin bilinmediği anlamına gelir.

Boş değerleri gösterebilmek için örnek bir tablo üretelim. Tabloya data ekleyelim.

 

drop table Employee;
create table Employee(
ID                 VARCHAR2(4 BYTE)         NOT NULL,
First_Name         VARCHAR2(10 BYTE),
Last_Name          VARCHAR2(10 BYTE),
Start_Date         DATE,
End_Date           DATE,
Salary             Number(8,2),
City               VARCHAR2(10 BYTE),
Description        VARCHAR2(15 BYTE));


insert into Employee(ID,  First_Name, Last_Name, Start_Date,End_Date,Salary,City,Description)
values ('01','Jason',    'Martin',  to_date('19960725','YYYYMMDD'), to_date('20060725','YYYYMMDD'), 1234.56, 'Toronto',  'Programmer');
insert into Employee(ID,  First_Name, Last_Name, Start_Date,End_Date,Salary,City,Description)
values('02','Alison',   'NULL', to_date('19760321','YYYYMMDD'), to_date('19860221','YYYYMMDD'), 6661.78, 'Vancouver','Tester');
select * from employee;
  • Boş değerler ile boş karakterleri NVL fonksiyonu ile ayırt edebiliriz.

NULL() fonksiyonu değerleri farklı bir değere döndürebilir. NVL() fonksiyonu iki parametre ile çalışır. 1. Parametreye kolon adı girilir. 2. Parametre boş alana yazdırılıcak olan değer girilir.

SELECT id, first_name, last_name, 
NVL(first_name, 'Unknown First Name') last_name_2, End_Date,   nvl(TO_DATE(end_date,'DD/MM/YYYY'),TO_DATE('01/01/1900','DD/MM/YYYY')) End_Date_2 FROM employee;

01    Jason    Martin    Jason    25.07.2006    25.07.0006
02    Alison    NULL    Alison                   01.01.1900

 

Trigger’lar dml (data manupulation language) olarak tanımladığımız. insert, update ve delete ifadelerinden sonra çalıştırılır. Triggerlar tablolar üzerinde oluşturulur.  Sql veya PL / SQL ifadelerinden oluşurlar.

Trigger oluşturan sql ifadeleri

CREATE [OR REPLACE ] TRIGGER trigger_name
{BEFORE | AFTER | INSTEAD OF }
{INSERT [OR] | UPDATE [OR] | DELETE}
[OF col_name]
ON table_name
[REFERENCING OLD AS o NEW AS n]
[FOR EACH ROW]
WHEN (condition)
DECLARE
   Declaration-statements
BEGIN
   Executable-statements
EXCEPTION
   Exception-handling-statements
END;


CREATE [OR REPLACE ] TRIGGER: /*Trigger verilen isimde oluşturlur veya değiştirilir.*/
BEFORE | AFTER | INSTEAD OF: /*Trigger’in ne zaman tetikleneceğini belirlenir.*/
BEFORE: /*Trigger içinde ki işlem tablo üzerinde ki işlemden önce gerçekleşir.*/
AFTER: /*Trigger içinde ki işlem tablo üzerinde ki işlemden sonra gerçekleşir.*/
INSTEAD OF: /*SQL ifadesi yerine Trigger'ın içerisindeki ifadeler çalıştırılır.*/
/*View üzerinde ki işlemlerde, view’ a ulaşmak yerine  içerisinde ki tablo oluşturulur.*/ 
INSERT [OR] | UPDATE [OR] | DELETE:  /*Seçilen DML işlemine göre trigger planlanır.*/
OF: /*Hangi sütunlar için trigger yapılacağı belirlenir.*/
ON: /*Hangi tablo için trigger yapılacağı belirlenir.*/
REFERENCING OLD AS o NEW AS n:  /*n DML sorgularındaki eski ve yeni değerleri verir.*/

Triggerlar procedurlerden farklı şekilde çalışırlar. Trigger oracle tarafından çalıştırılırken, procedure kullanıcı, application veya başka triggerlar tarafından çalıştırılır.

Trigger ile DML ifadeleri kısıtlanabilir. Tek bir trigger ile tabloya kullanıcıları girişi ve yetkisi engellenebilir.

Trigger ile;

  • Sütunlar için otomatik değer üretilir.
  • Loglama yapılabilir, güvenlik katmanı oluşturulabilir.
  • Tablo erişimi ile bilgi toplanır. Tablo eşitleme yapılabilir.
  • Uygun olmayan transactionlar engellenir.

Trigger’ların Kısımları:

 

Bir trigger’ın basitçe 3 tane kısmı vardır.

1-Trigger’ın hangi tablo üzerinde ne zaman çalışacağını gösteren kısım.

2-Trigger kısıtı – Ne zaman tetikleneceğini gösteren kısım.

3-Trigger aksiyonu – Bütün koşullar oluştuğunda trigger’ın hangi işlemleri yapacağını gösteren bölüm.

 

Trigger Örneği Çalışması

Trigger örneğine başlamadan önce ilk olarak üzerine trigger işlemi yaptırabileceğimiz içinde data bulunan bir tablo oluşturalım.

CREATE TABLE URUNLER 
(
URUN_NO INTEGER PRIMARY KEY,
URUN_ADI VARCHAR2 (20),
URUN_ADEDI FLOAT,
URUN_TURU VARCHAR2 (20),
URUN_GRS_TRH DATE
);
INSERT INTO URUNLER (URUN_NO, URUN_ADI, URUN_ADEDI, URUN_TURU, URUN_GRS_TRH) VALUES ('100','SU','200', 'SIVI', TO_DATE('24/08/2017','DD/MM/YYYY'));
INSERT INTO URUNLER (URUN_NO, URUN_ADI, URUN_ADEDI, URUN_TURU, URUN_GRS_TRH) VALUES ('101','ÇİKOLATA','500', 'TATLI', TO_DATE('24/08/2017','DD/MM/YYYY'));
INSERT INTO URUNLER (URUN_NO, URUN_ADI, URUN_ADEDI, URUN_TURU, URUN_GRS_TRH) VALUES ('102','EKMEK','100', 'UNLU MAMULLER', TO_DATE('24/08/2017','DD/MM/YYYY'));
INSERT INTO URUNLER (URUN_NO, URUN_ADI, URUN_ADEDI, URUN_TURU, URUN_GRS_TRH) VALUES ('103','SALAM','120', 'ET', TO_DATE('24/08/2017','DD/MM/YYYY'));
INSERT INTO URUNLER (URUN_NO, URUN_ADI, URUN_ADEDI, URUN_TURU, URUN_GRS_TRH) VALUES ('104','BEYAZ PEYNİR','50', 'SÜT', TO_DATE('24/08/2017','DD/MM/YYYY'));
INSERT INTO URUNLER (URUN_NO, URUN_ADI, URUN_ADEDI, URUN_TURU, URUN_GRS_TRH) VALUES ('105','SÜT','2000', 'SÜT', TO_DATE('24/08/2017','DD/MM/YYYY'));
COMMIT;
SELECT * FROM URUNLER;

CREATE TABLE TEDARIK 
(
URUN_NO INTEGER PRIMARY KEY,
TEDARIKCI VARCHAR (50),
FOREIGN KEY (URUN_NO) REFERENCES URUNLER (URUN_NO)
); 
INSERT INTO TEDARIK (URUN_NO, TEDARIKCI) VALUES (100, 'SUCU'); COMMIT;  
SELECT * FROM TEDARIK;
  • Tabloya data eklenmesi ile ilgili koşulları gösteren trigger
  • Tablodan kayıt sildirmeyen trigger
    CREATE OR REPLACE TRIGGER TRIG_URUN
       BEFORE DELETE ON URUNLER
       FOR EACH ROW
    DECLARE
    BEGIN
       raise_application_error (-20000,'SILME_YOK : Bu tablodan kayit silemezsiniz...');
    END;
    DELETE FROM URUNLER
    WHERE URUN_NO = '100';
    

  • Tabloya data eklenmesi ile ilgili koşulları gösteren trigger
CREATE OR REPLACE TRIGGER RESTRICT_URUNLER  
BEFORE INSERT OR UPDATE OF URUN_ADEDI ON URUNLER  
FOR EACH ROW  
BEGIN  
IF  (:new.URUN_ADI IN ('SU'))  
AND :new.urun_adedi > 200 THEN  
 RAISE_APPLICATION_ERROR (-20202,  
'su 200 adetten fazla satın alınamaz');  
END IF;  END;

INSERT INTO URUNLER (URUN_NO, URUN_ADI, URUN_ADEDI, URUN_TURU, URUN_GRS_TRH) VALUES ('110','SU','201', 'SIVI', TO_DATE('25/08/2017','DD/MM/YYYY'));

Triggerlar konusunda ilerleyen dönemlerde ki çalışmaları yine bu sayfadan takip edebilirsiniz. 🙂