PL/SQL Inline Functions/Procedures

Herkese Selam,

Bu yazıda sizlere Oracle 12c ile beraber gelen inline yordamlardan bahsedicem. Umarım farkındalık anlamında faydalı bir yazı olur.

Oracle 12c sürümünden önce fonksiyon veya prosedür çalıştırmanın yolu DB içerisinde fonksiyon veya prosedürü yazıp saklamak ve ihtiyacımız olduğunda SQL veya PL/SQL üzerinden çağırmaktı. Yada SQL ile işimizi çözemeyip işimizi PL/SQL yazarak çözmek oluyordu. Bu 2 yöntemde DB üzerinde ihtiyacımızdan fazla ve çoğu zamanda kullanılmayacak fonksiyon veya prosedür yaratmamıza neden olarak çalıştığımız ortamı karmaşıklaştırıyordu. Oracle 12c ile beraber gelen inline yordamlar ile saklı yordamlar yaratmaya gerek kalmadan runtime (on the fly) da oluşacak ve kodun çalışması bittiğinde ortadan kalkacak  DB de yer kaplamayacak inline yeni bir yapı geliştirildi. Bu yapı hali hazırda WITH clause entegre edilmiş durumda ve kullanımı oldukça kolay.

Şimdi bir kaç örnek ile nasıl kullanıldığına bakalım.

employee_id değerini parametre olarak alan ve bu çalışanın maaşını geri döndüren bir inline fonksiyon yazıp kullanalım.

WITH FUNCTION get_salary (p_eid NUMBER)
        RETURN NUMBER
     IS
        v_sal   NUMBER;
     BEGIN
        SELECT salary
          INTO v_sal
          FROM hr.employees
         WHERE employee_id = p_eid;

        RETURN v_sal;
     END;

SELECT get_salary (100)
  FROM DUAL;


GET_SALARY(100)
---------------
          24000 

Evet yukarıda yazılmış koddan da anlaşılacağı üzere With Clause içinde fonksiyonumuzu yazıp with clausedan sonra yazdığımız SQL cümlesinde inline fonksiyonumuzu kullanabildik. Daha öncede söylediğim gibi bu fonksiyon run time da on the fly oluştu ve kodun çalışması bittiğinde geçrliliğini yitirdi.

Şimdi benzer görevi gerçekleştirecek örnek prosedür de yazalım.

WITH PROCEDURE write_name (p_empid NUMBER)
     IS
        v_name   VARCHAR2 (100);
     BEGIN
        SELECT first_name || ' ' || last_name
          INTO v_name
          FROM hr.employees
         WHERE employee_id = p_empid;

        DBMS_OUTPUT.put_line ('Name Surname:' || v_name);
     END;

     FUNCTION get_salary (p_empid NUMBER)
        RETURN NUMBER
     IS
        v_sal   NUMBER;
     BEGIN
        SELECT salary
          INTO v_sal
          FROM hr.employees
         WHERE employee_id = p_empid;

        write_name (p_empid);
        RETURN v_sal;
     END;

SELECT get_salary (100)
  FROM DUAL;

GET_SALARY(100)
---------------
          24000 

Name Surname:Steven King

Şimdi bu yapıyı PL/SQL ile nasıl entegre edip kullanabiliriz ona bir göz atalım.

DECLARE
   v_sql      VARCHAR2 (1000);
   v_salary   NUMBER;
BEGIN
   v_sql :='WITH PROCEDURE write_name (p_empid NUMBER)
             IS
                v_name   VARCHAR2 (100);
             BEGIN
                SELECT first_name
                  INTO v_name
                  FROM hr.employees
                 WHERE employee_id = p_empid;

                DBMS_OUTPUT.put_line (v_name);
             END;

             FUNCTION get_salary (p_empid NUMBER)
                RETURN NUMBER
             IS
                v_sal   NUMBER;
             BEGIN
                SELECT salary
                  INTO v_sal
                  FROM hr.employees
                 WHERE employee_id = p_empid;

                write_name (p_empid);
                RETURN v_sal;
             END;

        SELECT get_salary (100)
          FROM DUAL';

   EXECUTE IMMEDIATE v_sql INTO v_salary;

   DBMS_OUTPUT.put_line (v_salary);
END;

-------------
Steven
24000

Evet yukarıdaki örnekten anlaşılacağı gibi bu yapıyı PL/SQL içine bir dinamik SQL yardımı ile entegre edip kolayca kullanabildim. Bu şekilde saklı yordam yapıp DB içinde yeniden bir obje yaratmadan kodumu modülerize ederek işimi hallettim. Oracle DB 12 c ile gelen Inline yordamlar görüldüğü üzere oldukça işlevsel ve işimizi kolaylaştırır nitelikte.

Kaynaklar

http://docs.oracle.com/cd/E16655_01/index.htm

http://jonathanlewis.wordpress.com/2013/07/01/12c-determinism/

http://technology.amis.nl/2013/06/25/oracle-database-12c-in-line-plsql-functions-in-sql-queries/

 

 

 

About these ads

About ... from Emrah METE

Bilgisayar Mühendisi
This entry was posted in Oracle, Uncategorized and tagged , , , , , , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s