PL/SQL

PL SQL Mail Gönderme

CREATE OR REPLACE PROCEDURE MAIL_GONDER (p_to        IN VARCHAR2,
                                       p_subject   IN VARCHAR2,
                                       p_message   IN VARCHAR2)
AS
   l_mail_conn   UTL_SMTP.connection;
   p_from        VARCHAR2 (30) := 'Gonderici Bilgisi';
   p_smtp_host   VARCHAR2 (30) := 'mail server bilgisi';
   p_smtp_port   NUMBER := 25;
BEGIN
   l_mail_conn := UTL_SMTP.open_connection (p_smtp_host, p_smtp_port);
   UTL_SMTP.helo (l_mail_conn, p_smtp_host);
   UTL_SMTP.mail (l_mail_conn, p_from);
   UTL_SMTP.rcpt (l_mail_conn, p_to);

   UTL_SMTP.open_data (l_mail_conn);

   UTL_SMTP.write_data (l_mail_conn,'Date: ' || TO_CHAR (SYSDATE, 'DD-MON-YYYY HH24:MI:SS') || UTL_TCP.crlf);
   UTL_SMTP.write_data (l_mail_conn, 'To: ' || p_to || UTL_TCP.crlf);
   UTL_SMTP.write_data (l_mail_conn, 'From: ' || 'Database Report Mail' || UTL_TCP.crlf);
   UTL_SMTP.write_data (l_mail_conn,'Subject: ' || p_subject || UTL_TCP.crlf);
   UTL_SMTP.write_data (l_mail_conn,'Reply-To: ' || p_from || UTL_TCP.crlf || UTL_TCP.crlf);

   UTL_SMTP.write_data (l_mail_conn,p_message || UTL_TCP.crlf || UTL_TCP.crlf);
   
   UTL_SMTP.close_data (l_mail_conn);

   UTL_SMTP.quit (l_mail_conn);
END;
/
begin
  dbms_network_acl_admin.create_acl (
    acl         => 'utl_mail.xml',
    description => 'Allow mail to be send',
    principal   => 'Mail Gonderecek Username',
    is_grant    => TRUE,
    privilege   => 'connect'
    );
    commit;
end;


BEGIN
  DBMS_NETWORK_ACL_ADMIN.assign_acl (
  acl => 'utl_mail.xml',
  host => 'mail server', 
  lower_port => '25',
  upper_port => '25');
  COMMIT;
END;
/
Begin
MAIL_GONDER('Gonderilen mail adresi','Konu','Deneme mesajı');
End;
/

exec MAIL_GONDER('Gonderilen mail adresi','Konu','Deneme mesajı');

Loading


PL/SQL Transactions

Bir transaction; birden çok SQL sorgularının çalıştırıldığı ama Oracle’ın, bu sorguların tamamını bir ünite(set) olarak algıladığı mantıksal sorgu bloğudur. Bu blok rollback ya da commit ile parçalanabilir veya sonlandırılabilir. Yani begin yada herhangi bir SQL cümlesi ile başladığımız ve COMMIT, ROLLBACK veya işlemleri sonlandıracak bir söz deyimi ile karşılaşmamız arasında yapılan tüm aksiyonlardır. Transaction işlemi başlar ve bitirilir. Transaction’nın başlaması için;

  • Veri tabanına bağlanıp ilk SQL cümlesinin çalışması
  • Her transaction bitiminden sonra sonra yeni bir SQL’in çalışması ile

Bir transaction’ın  bitmesi için aşağıdaki işlemlerden birinin olması yeterlidir.

  • COMMIT veya ROLLBACK işlemlerinden birinin yapılması
  • DDL işlemlerinden birinin(CREATE ,DROP,ALTER ve RENAME) yapılıyor olması. Bunun nedeni ise hatırlayacağınız gibi DDL işlemleri AUTO COMMIT ‘dir. Yani sizin commit etmenize gerek yoktur direk commitler.
  • DCL işlemlerininden birinin yapılması GRANT,REVOKE gibi. Bunun nedeni de yine AUTO COMMIT olmasıdır.
  • Kullanıcının veri tabanından bağlantısının kesilmesi.

COMMIT :  Çalışmasını dışardan vereceğimiz komut ile tetiklebilmek için 2 farklı komut çalıştırabiliriz. Bunlar COMMIT ve COMMIT WORK’tür. Commit transaction’ı sonlandırarak tüm yapılan değişikliklerin kalıcı olmasını sağlamaktadır. Bu sayede yapılan tüm değişiklikler tüm sessionlar tarafından görünür olabilecektir.Örneşin aşağıdaki işlem bir transactiondır ve işlemin sonunda herhangi bir problem olmadığında  COMMIT işlemi ile transactionımız son bulur.

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (5, 'Hardik', 27, 'Bhopal', 8500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (6, 'Komal', 22, 'MP', 4500.00 );
COMMIT;

(continue reading…)

Loading


PL/SQL Collections

Collection koleksiyon veya bir topluluk olarak çevrilebilir. Collection’lar içerlerinde aynı tip bir yada birden çok data bulundururlar. PL/SQL ‘de üç tip collectiondan söz edebiliriz.

  • Index-by tables or Associative array
  • Nested Table
  • Variable-size array or Varray

Associative Array

Associative Array’ler PL/SQL ‘de dinamik array yapılarıdır. Programlama dillerinden hatırladığımız üzere arraylerin başlangıçta initiliaze edilme ve eleman sayısının belirlenme durumu söz konusudur. Associative array’lerde böyle zorunluluklar söz konusu değildir. Array’i doğrudan içine tutacağı eleman sayısını belirlemeden ve initiliaze etmeden  yaratıp istediğimiz indisine eleman ekleyebilme olanağına sahibiz. Bunun yanı sıra klasik array mantığımızda var olan indis’in yalnızca sayısal değer olabilme kısıtı Associative Array yapısında yoktur. Bu durumu açıcak olursak, array’in içerisinde hareket etmemizi sağlan indis string veya integer olabilmekte. İndis tipini “index by” söz deyimi ile tanımlayabilmekteyiz

PL/SQL’de collection yaratabilmemiz için öncelikle TYPE söz deyimi ile bir tip tanımlayı daha sonra bu tip üzerinden bir değişken tanımlamamız gerekmektedir.

Yaratmak istediğimiz tipin array olacağını ise “is table of”  söz deyimi ile gerçekleştirmekteyiz.

DECLARE
   TYPE salary IS TABLE OF NUMBER INDEX BY VARCHAR2(20);
   salary_list salary;
   name   VARCHAR2(20);
BEGIN
   -- adding elements to the table
   salary_list('Rajnish')  := 62000;
   salary_list('Minakshi')  := 75000;
   salary_list('Martin') := 100000;
   salary_list('James') := 78000;

   -- printing the table
   name := salary_list.FIRST;
   WHILE name IS NOT null LOOP
      dbms_output.put_line
      ('Salary of ' || name || ' is ' || TO_CHAR(salary_list(name)));
      name := salary_list.NEXT(name);
   END LOOP;
END;
/
DECLARE
   CURSOR c_customers is select  name from customers;

   TYPE c_list IS TABLE of customers.name%type INDEX BY binary_integer;
   name_list c_list;

   counter integer :=0;
BEGIN
   FOR n IN c_customers LOOP
      counter := counter +1;
      name_list(counter)  := n.name;
      dbms_output.put_line('Customer('||counter|| '):'||name_list(counter));
  END LOOP;
END;
/

(continue reading…)

Loading


PL/SQL PACKAGES

Package olarak bahsettiğimiz yapılar çeşitli PL\SQL tiplerinin, fonksiyonların, procedure’leriin ve alt programcıkların toplandığı object’lerdir. Peki neden package ihtiyaç duyarız mesela küçük sistemlerde oluşturduğunuz procedure ve function yapılarının kontrolü çok büyük bir problem çıkarmayacaktır fakat büyük sistemlerde belki yüzlerce,binlerce function ,procedure ,varray ,record vs bulunabilir, bu tür büyük sistemlerde kodları mantıksal olarak bir araya toplamak ve kolay erişimi sağlamak amacı ile paketler kullanılır. Örnek vermek gerekirse bir bankada core finans için bir package, CRM için bir package, emeklilik sistemi için bir package gibi düşünebiliriz. Bu bilgilerden yola çıkarak package’ın avantajları olarak aşağıdakileri düşünebiliriz;

  • Kullanım kolaylığını sağlar.
  • Uygulama dizaynını kolaylaştırır.
  • Modülerliği sağlar.
  • Performansı artırır.

Paket yapılarının zorunlu olan iki alanı vardır.

  1. Specification
  2. Body

Specification : Package’in interface(arayüz)’i olarak düşünebilirsiniz. Paket içerisinde bulunan fonksiyon ve prosedürlerin içerik bilgisi haricinde sadece tipi ve aldığı parametreleri gördüğümüz kısımdır. Paket oluştururken ilk önce Spec kısmı oluşturulur.

CREATE PACKAGE cust_sal AS
   PROCEDURE find_sal(v_id hr.employees.employee_id%type);
END cust_sal;
/

Body : Paketin gövdesidir. Tüm tanımlamalar, fonksiyonlar ,prosedürler bu kısımda yazılır. Spec içerisinde tanımlanan yapıların içerikleri burada bulunur. Spec kısmı oluşturulan paketin body içeriğini aşağıdaki gibi oluştururuz.

CREATE OR REPLACE PACKAGE BODY cust_sal AS
   PROCEDURE find_sal(v_id hr.employees.employee_id%TYPE) IS
   v_sal hr.employees.salary%TYPE;
   BEGIN
      SELECT salary INTO v_sal FROM hr.employees WHERE id = v_id;
      dbms_output.put_line('Salary : '|| v_sal);
   END find_sal;
END v_sal;
/

(continue reading…)

Loading


PL/SQL TRIGGERS

Trigger’ın türkçe karşılığı tetikleyici’dir. PL/SQL’de yazılıp saklanan yapılardır. Triggerlar yazılır ve yazılma aşamasında belirtilen koşullarda otomatik olarak çalışır. Örnek olarak tabloya bir kayıt eklediğimizde otomatik olarak kayıt tarihi olarak sistem tarihinin atması ya da tabloda bir güncelleme veya silme yaptığımızda ilgili kayıt için başka bir tabloya log kaydı atması gibi çeşitli sebepler ve kontroller için triggerlara ihtiaç duyarız.

Triggerlar aslında bir prosedürdür fakat prosedürlerden farkı Oracle tarafından çağrılmasıdır. Prosedürler bir trigger ,bir uygulama ya da kullanıcı tarafından çağrılan yapılardır. Yani trigger’lar SQL ve PL\SQL ifadelerini içerebilirler ve diğer PL\SQL birimlerini çağırabilirler, veritabanında saklanırlar, belirli durumlarda çağırılırlar.

Trigger’lar veritabanında tablolardan farklı bir yerde tutulurlar. Ayrıca triggerlar  sadece tablolar üzerinde tanımlanabilirler ve tanımlandıktan sonra tabloya eklenecek veriler ile ilgilenir öncesi için bir kontrol yapmaz. View’lar üzerine tanımlanamasalarda, view’ların üzerinde bir değişiklik yapılmaya çalışıldığında view’ın üzerine tanımlandığı tablolarda kaydedilmiş trigger’lar çalıştırılır.

Trigger’ın Tetiklendiği Durum Tipleri ;

  • Herhangi bir DML ifadesi : INSERT, UPDATE, DELETE
  • Herhangi bir DDLifadesi: CREATE, ALTER, DROP
  • Herhagi bir veritabanı işleminde: Örnek olarak Logon, Logoff, Startup, Shutdown işleminde.

Trigger’in Faydaları ;

  • Sütunlar için otomatik olarak değerler üretmesi
  • Güvenlik katmanı oluşturmak için
  • Loglama
  • Yapılan işlemlerle ilgili kayıt oluşturmak için
  • Tablolar arasında eşleme ve eşitleme yapmak için
  • Tablo erişimiyle ilgili bilgiler toplamak için
  • Uygun olmayan transaction’ları engellemek için

(continue reading…)

Loading


PL/SQL EXCEPTIONS

Exception kelimesinin Türkçe karşılığı istisna demektir ve PL/SQL ‘de hataları yakalamak için kullanılan yapıya bu ad verilir. Exception blokları sayesinde kod içerisinde karşılaşılması öngörülen hatalar yakalanıp gerekli işlemler yapılabilir.

Eğer programımızda hata kontrolü yoksa programın çalışması durur ve programın kontrolü işletim sistemine döner. Hata kontrolü varsa da program hatalara rağmen devam edebilir.

Exception iki türlü tanımlanabilir :

  1. Sistem Tanımlı Exceptionlar(System Defined Exceptions)
  2. Kullanıcı Tanımlı Exceptionlar(User Defined Exceptions)

Kullanıcı Tanımlı Exceptionlar(User Defined Exceptions)

Bir uygulama yazıyorsunuz ve bu uygulamaya özel bazı hatalarınız oluşuyor ve bunları yakalamak ,ekrana bilgi vermek ya da loglamak istiyorsunuz. Bu gibi durumlarda PL/SQL sadece sistem tanımlı olan exceptionları değil kendi tanımladığınız hatalarınızı da yakalama şansı veriyor.

PL/SQL de hata tanımlaması yaparken aşağıdaki sintaksisi kullanıyoruz ;

DECLARE
   my-exception EXCEPTION;

Aşagıdaki örnekte bir exception tanımlıyoruz id’yi sıfır’ın altında girersek ex_invalid_id  exceptionu çalışacak.Başka bir hata durumunda ise tanımlı gelen exceptionlardan birisi çalışacak.

NOT :  Exception’ı hata olarak yakalaması için RAISE ifadesini kullandık. Raise’in karşılığı ‘uyandırmak’ olarak düşünülebilir ve burada ‘git ve oluşturduğum hatayı uyandır cevabını versin’ diyorsunuz

DECLARE
   v_id hr.employees.employee_id%type := &cc_id;
   v_name  hr.employees.first_name%type;
   v_surn hr.employees.last_name%type;

   -- exception tanimlariz
   ex_invalid_id  EXCEPTION;
BEGIN
   --exception sartini belirtiriz
   IF v_id <= 0 THEN
      RAISE ex_invalid_id;
   ELSE
      SELECT  first_name, last_name INTO  v_name, v_surn
      FROM hr.employees
      WHERE employee_id = v_id;

      DBMS_OUTPUT.PUT_LINE ('Name: '||  v_name);
      DBMS_OUTPUT.PUT_LINE ('Surname: ' || v_surn);
   END IF;
EXCEPTION
   --tanimladigimiz exception ise
   WHEN ex_invalid_id THEN
      dbms_output.put_line('ID must be greater than zero!');
   WHEN no_data_found THEN
      dbms_output.put_line('No such customer!');
   WHEN others THEN
      dbms_output.put_line('Error!');
END;
/

(continue reading…)

Loading


  • Sertifikasyon



  • Etiketler

  • Topluluklar

                     
                     
  • Copyright © 1996-2010 Mustafa Bektaş Tepe. All rights reserved.
    Türkçeleştirme Blogizma | AltyapıWordPress