Arşiv

Posts Tagged ‘package’

pl/sql de procedure, function overloading işlemi


overloadMerhaba,

Overload işlemi nedir ve neden ihtiyaç duyarız bunlara biz göz atalım ve pl/sql ile procedure ve function overload işlemi için hazırladığım örnek package kodlarımızı inceleyelim. Tabi overload deyince de aklımıza hemen yan taraftaki resim gibi izlenim oluşmasın. Bizim yapacağımız işlem kendi kontrolümüzde olacak ve yan taraftakine benzer bir senaryoya dönüşmeyecek.

Normal şartlar altında overload işlemine ihtiyacımız olmaz. Ama bazı durumlarda overload yapmamız gerekiyor. Örnek topla diye bir fonksiyon hazırladığımızı varsayalım ve bu fonksiyon içerisine aldığı iki değeri toplayıp bize geriye toplam sonucu döndürsün. Bu işlem sonrasında tekrardan bir toplama işlemine ihtiyacımız olduğunda bu sefer iki değil 3 ya da 4 sayıyı toplayıp bize sonucu döndüren bir fonksiyona ihtiyacımız olduğunda tekrardan yeni bir isim ile bu işlemi yapan fonksiyonu yazacaktık. Bunun yerine tüm fonksiyonların adı topla olsun ve ben içeriye kaç parametre gönderirsem sistem ilgili fonksiyonu kendisi çağırıp bana sonucu döndürsün. Böyle bir işlem yapınca overload işlemini gerçekleştirmiş oluyoruz.

Şimdi artık hazırladığım package ı kontrol edip birden fazla olan overload yöntemlerini ve örneklerimizi kontrol edelim. Pl/Sql ile overload işleminin prosedür için iki farklı yöntemi vardır;

  1. Prosedür içine gönderilen parametrenin tipine göre
  2. Prosedür içine gönderilen parametrelerin sayısına göre.

Bu işlem fonksiyon için iki değil üç farklı yöntem ile yapılır ve ilk iki yöntem prosedür ile aynıdır . Bu yöntemler;

  1. Fonksiyon içine gönderilen parametrenin tipine göre
  2. Fonksiyon içine gönderilen parametrelerin sayısına göre
  3. Fonksiyonun dönüş tipine göre

Artık pl/sql ile overload işlemini nasıl yapacağımızı öğrendiğimize göre örneklere geçebiliriz sanırım. Öncelikle package kodlarımızı ekleyelim ve sonrasında da bu package kullanımı ile örnek sonuçlarımızı kontrol edelim. Daha fazlasını oku…

pl/sql de public,private procedure ve function kullanımı


Merhaba,
Pl/Sql ile geliştirdiğimiz projelerde çoğu zaman procedure, function, type, package vb. sistemler kullanırız. Kullanmış olduğumuz bu yapılar içinde bazen yazdığımız kodları ve scriptleri sadece kendimizin müdahale etmesini isteriz. İşte bu gibi durumlar public ve private yapısı karşımıza çıkıyor.
Hazırlamış olduğumuz bir package içindeki function ya da procedure lerden sadece bizim belirlediğimiz işlemleri diğer kişilerin kullanmasını istiyorsak public ve kendimize özel scriptler yazmak istiyorsak private yapısını kullanabiliriz.
Bu işlemleri daha anlaşılır olarak örneklemek için bir tane package hazırlayalım ve bu package içinde hem private hem de public scriptler hazırlayarak işlemlerimizi kontrol edelim. Burada dikkat etmemiz gereken hususlar öncelikle hazırlayacak olduğumuz package içinde spec kısmına yazacağımız tanımlamalara ait procedure ya da function ların public olarak kullanılacağı ve body kısmında yazacağımız procedure ya da function ların private olarak kullanılacağıdır.
Şimdi paketimizi hazırlayalım ve public, private scriptleri paket üzerinden inceleyelim.

CREATE OR REPLACE PACKAGE public_private_package IS

  -- Author  : SAMETCELIKBICAK
  -- Created : 18.04.2011 16:35:55
  -- Purpose : Public ve Private Package Kullanımı Örneği

  PROCEDURE public_procedure(param1 NUMBER, param2 VARCHAR2);
  FUNCTION public_function(param1 NUMBER, param2 VARCHAR2, param3 NUMBER) RETURN VARCHAR2;

END public_private_package;

Paketimizin spec kısmını hazırladık ve burada belirtmiş olduğumuz procedure ve function public olarak tanımlanır ve bu paketi kullanmak isteyen herkes tarafından erişilebilirler.
Şimdi paketimizin body kısmını hazırlayalım ve burada da private şeklinde procedure ve funtion hazırlayalım ve kullanalım.

CREATE OR REPLACE PACKAGE BODY public_private_package IS

  PROCEDURE private_procedure(param1 NUMBER, param2 VARCHAR2) IS
  BEGIN
    dbms_application_info.set_action('Private Proc., P1=' || param1 || ' , P2=' || param2);
  END;
  ---------------------------------------------------------------------------------------
  FUNCTION private_function(param1 NUMBER, param2 VARCHAR2) RETURN VARCHAR2 IS
  BEGIN
    RETURN('Private Function , Param1=' || param1 || ' , Param2=' || param2);
  END;
  ---------------------------------------------------------------------------------------
  PROCEDURE public_procedure(param1 NUMBER, param2 VARCHAR2) IS
  BEGIN
    dbms_application_info.set_action('Public Proc., P1=' || param1 || ' , P2=' || param2);
  END;
  ---------------------------------------------------------------------------------------
  FUNCTION public_function(param1 NUMBER, param2 VARCHAR2, param3 NUMBER) RETURN VARCHAR2 IS
    private_func VARCHAR2(100);
  BEGIN
    IF nvl(param3, 0) = 0 THEN
      RETURN('Public Function , Param1=' || param1 || ' , Param2=' || param2);
    ELSE
      private_func := private_function(456, 'Private Function,Public Function İçinden Çağırıldı.');
      RETURN(private_func);
    END IF;
  END;
  ---------------------------------------------------------------------------------------
BEGIN
  NULL;
END public_private_package;

Paketimizin body kısmını da hazırladığımıza göre artık örnek kullanımlara geçebiliriz. Örnek olarak public function bilgisini kullanalım.

SELECT public_private_package.public_function(123, 'SAMET', 0) p1,
       public_private_package.public_function(123, 'SAMET', 1) p2
  FROM dual;

Burada iki farklı parametre ile public function kullanımı yaptık ve package body kısmında da görüleceği gibi public function ile private function kullanımını da yaptık.

P1 P2
Public Function , Param1=123 , Param2=SAMET Private Function , Param1=456 , Param2=Private Function,Public Function İçinden Çağırıldı.

Örnek olarak public procedure kullanımı ile de session action bilgisine parametre değerlerimizi atalım.

BEGIN
  public_private_package.public_procedure(789, 'SAMET');
END;

Bu işlemler sonucunda private olan procedure ya da function kullanılmak istenildiğinde ise sistem tarafından hata alınacaktır.
Bu gibi durumlar dikkat etmeniz gereken bir durumda package body kısmında tanımlayacağımız private nesnelerin kod bloğunda ilk önce yazılmasıdır. Bu hem package içinde okunurluğu hem de program içinde kod çalışma hiyerarşisinde düzeni sağlayacaktır.
Bu işlemlerde en sık yaşanan sorun private bir procedure ya da funtion bilgisinin kendisinden önce tanımlanan başka bir procedure ya da function içerisinden çağırılarak çalıştırılmak istenmesidir. Program akış hiyerarşisinde bu daha tanımlanmamış olan bir nesne çağırılmak istenildiği içinde sistem hata verecektir.
Kolay gelsin.

pl/sql package örnek

08 Haziran 2010 2 yorum

Merhaba,

Pl/sql de package kullanımına ve oluşturulmasına bir örnek. Çoğu zaman sıklıkla ya da belirli bir işlem için kullanılan birden fazla database işlemimiz var ise (procedure,function vb.) bu işlemlerin hem kullanımı hem de kolay takibi için package kullanılır. Örnek olarak aşağıda bir package oluşturulmuştur.

Package oluşturmak için öncelikle package spec bilgisini oluşturmalıyız. Package spec bilgisinde package içerisinde kullanacak olduğumuz procedure,funciton vb. database işlemimizi belirleriz.

CREATE OR REPLACE PACKAGE example_package IS

  -- Author  : SAMETCELIKBICAK
  -- Created : 08.06.2010 16:46:37
  -- Purpose : pl/sql package örnek

  FUNCTION example_function(param1 NUMBER, param2 NUMBER, param3 VARCHAR2) RETURN VARCHAR2;

END example_package;

Package spec aşamasında belirtmiş olduğumuz database işlemlerimizin içeriği ise package body kısmında doldurulur.

CREATE OR REPLACE PACKAGE BODY example_package IS

  FUNCTION example_function(param1 NUMBER, param2 NUMBER, param3 VARCHAR2) RETURN VARCHAR2 IS
    RESULT VARCHAR2(500);
  BEGIN
    IF param3 = '+' THEN
      RESULT := to_char(param1) || '+' || to_char(param2) || '=' || (param1 + param2);
    ELSIF param3 = '-' THEN
      RESULT := to_char(param1) || '-' || to_char(param2) || '=' || (param1 - param2);
    ELSIF param3 = '*' THEN
      RESULT := to_char(param1) || '*' || to_char(param2) || '=' || (param1 * param2);
    ELSIF param3 = '/' THEN
      RESULT := to_char(param1) || '/' || to_char(param2) || '=' || (param1 / param2);
    END IF;
    RETURN(RESULT);
  END;

BEGIN
  NULL;
END example_package;

Package body kısmında da ihtiyacımız olan database işlemlerini yaptıktan sonra şimdi sıra oluşturduğumuz package ve içindeki nesneleri kullanmaya geldi. örnek olarak da aşağıdaki gibi bir script yazılabilinir.

SELECT example_package.example_function(2, 5, '+') "Toplama",
       example_package.example_function(2, 5, '-') "Çıkarma",
       example_package.example_function(2, 5, '/') "Bölme",
       example_package.example_function(2, 5, '*') "Çarpma"
  FROM dual;

Bu scriptin çıktısıda aşağıdaki gibidir.

oracle forms pll


Merhaba oracle forms da basit olarak hazırlanmış bir pll örneği.

PACKAGE forms_pll IS

  PROCEDURE forms_pll_procedure;
  FUNCTION forms_pll_function(pll_param1 VARCHAR2, pll_param2 NUMBER)
  RETURN VARCHAR2;

END;
/*-------------------------------------------------------------------------*/
PACKAGE BODY forms_pll IS

  forms_pll_handle           ora_ffi.libhandletype;
  forms_pll_procedure_handle ora_ffi.funchandletype;
  forms_pll_function_handle  ora_ffi.funchandletype;

  PROCEDURE ff_forms_pll_procedure(fhandle ora_ffi.funchandletype);
  PRAGMA interface(c, ff_forms_pll_procedure, 11265);

  FUNCTION ff_forms_pll_function(fhandle ora_ffi.funchandletype,
                   pll_param1 VARCHAR2, pll_param2 NUMBER) RETURN VARCHAR2;
  PRAGMA interface(c, ff_forms_pll_function, 11265);

  PROCEDURE forms_pll_procedure IS
  BEGIN
    ff_forms_pll_procedure(forms_pll_procedure_handle);
  END;

  FUNCTION forms_pll_function(pll_param1 VARCHAR2, pll_param2 NUMBER) 
   RETURN VARCHAR2 IS
  BEGIN
    RETURN(ff_forms_pll_function(forms_pll_function_handle,
       pll_param1, pll_param2));
  END;

BEGIN

  forms_pll_handle           := ora_ffi.load_library('dll_path', 'dll_name');
  forms_pll_procedure_handle := ora_ffi.register_function(forms_pll_handle,
    'dll_item_name', ora_ffi.c_std);
  forms_pll_function_handle  := ora_ffi.register_function(forms_pll_handle, 
    'dll_item_name', ora_ffi.c_std);
  ora_ffi.register_parameter(forms_pll_function_handle, ora_ffi.c_char_ptr);
  ora_ffi.register_parameter(forms_pll_function_handle, ora_ffi.c_char_ptr);
  ora_ffi.register_return(forms_pll_function_handle, ora_ffi.c_char_ptr);

EXCEPTION
  WHEN OTHERS THEN
    FOR i IN 1 .. tool_err.nerrors LOOP
      message(tool_err.message);
      pause;
      tool_err.pop;
    END LOOP;
END;