DBMS_APPLICATION_INFO Paketi İle Uygulama Takibi

Herkese Selam,

Bu yazıda sizlere Oracle’ın yanılmıyorsam 8 sürümünden beri hayatımızda olan ancak çok sık kullanmadığımız bir built-in (DBMS_APPLICATION_INFO) paketin kullanımından kısaca bahsedeceğim. Umarım farkındalık anlamında faydalı bir yazı olur.

DBMS_APPLICATION_INFO paketi DB’de yaptığımız işlemleri bizim vereceğimiz spesifik işlem adları ile veritabanına register olmasına olanak sağlayan ve daha sonra kullandığımız işlem adları ile yaptığımız işlemleri veritabanındaki dynamic performance viewları aracılığı ile monitör etmemizi sağlayan oldukça faydalı bir alt yapı. Register ettiğimiz işlemlerimizi v$session ve v$sqlarea viewları üzerinden basit bir şekilde görüntülyebilmekteyiz.

DBMS_APPLICATION_INFO paketi bize 6 farklı kullanım opsiyonu sunmakta bunlar.

SET_CLIENT_INFO: Geçerli session’ı daha rahat takip edebilmek için session’a extra bir client bilgisi eklememize olanak sağlar.

BEGIN
DBMS_APPLICATION_INFO.SET_CLIENT_INFO ('test_set_client_info');
END;
-- Simdi aynı session i v$session uzerinden verdigim client_info  -- bilgisine göre sorgulayabiliyorum.
SELECT * FROM V$SESSION WHERE CLIENT_INFO= 'test_set_client_info';

1

 

READ_CLIENT_INFO: Geçerli session’da setlenmiş client_info bilgisini okumaya olanak sağlar.

SET SERVEROUTPUT ON
DECLARE
   cl_name   VARCHAR2 (100);
BEGIN
   DBMS_APPLICATION_INFO.READ_CLIENT_INFO (cl_name);
   DBMS_OUTPUT.PUT_LINE (cl_name);
END;

---- DBMS_OUTPUT ----
Client Info Name:test_set_client_info

SET_MODULE: Geçerli olan uygulamamız için bir modül adı girerek bu uygulamaya ait işlemleri bu modül adı ile takip etmemizin sağlayan alt yordam. (Bu kısımla ile ilgili örnek set_action’dan sonra yapilacaktir.)

SET_ACTION: Geçerli olan uygulamamız için tanımladığımız modülü için spesifik alt işlem bilgisi yazmamıza ve bu bilgiye göre görüntüleme yapmamıza olanak sağlayan alt yordam.

CREATE OR REPLACE PACKAGE hr.dep_maintain
IS
   FUNCTION get_depname (depid hr.departments.department_id%TYPE)
      RETURN HR.DEPARTMENTS.DEPARTMENT_NAME%TYPE;

   FUNCTION get_dep_man_name (depid hr.departments.department_id%TYPE)
      RETURN HR.EMPLOYEES.FIRST_NAME%TYPE;

END dep_maintain;

---------------------------------------------------------

CREATE OR REPLACE PACKAGE BODY hr.dep_maintain
IS
   FUNCTION get_depname (depid hr.departments.department_id%TYPE)
      RETURN HR.DEPARTMENTS.DEPARTMENT_NAME%TYPE
   IS
      depname   HR.DEPARTMENTS.DEPARTMENT_NAME%TYPE;
   BEGIN
      DBMS_APPLICATION_INFO.SET_MODULE ('MODULE:DEP_MAINTAIN',
                                        'ACTION:GET_DEPNAME');

      SELECT department_name
        INTO depname
        FROM hr.departments
       WHERE department_id = depid;

      RETURN depname;
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         RAISE_APPLICATION_ERROR (-20001, 'Data Bulunamadi....');
   END get_depname;

   ----------------
   FUNCTION get_dep_man_name (depid hr.departments.department_id%TYPE)
      RETURN HR.EMPLOYEES.FIRST_NAME%TYPE
   IS
      mng_name   HR.EMPLOYEES.FIRST_NAME%TYPE;
   BEGIN
   DBMS_APPLICATION_INFO.SET_MODULE ('MODULE:DEP_MAINTAIN',
                                     'ACTION:GET_DEP_MAN_NAME');
 SELECT first_name
 INTO mng_name
 FROM hr.employees e, hr.departments d
 WHERE E.EMPLOYEE_ID = D.MANAGER_ID AND D.DEPARTMENT_ID = DEPID;
 
 RETURN mng_name;
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         RAISE_APPLICATION_ERROR (-20001, 'Data Bulunamadi....');
   END get_dep_man_name;
END dep_maintain;

Şimdi çalışan sorguları v$sqlarea viewından görüntülemek için bir kaç sorgu atalım.

SELECT hr.dep_maintain.get_dep_man_name (10) FROM DUAL;

SELECT hr.dep_maintain.get_dep_man_name (20) FROM DUAL;

SELECT hr.dep_maintain.get_depname (30) FROM DUAL;

SELECT hr.dep_maintain.get_depname (40) FROM DUAL;

-- Simdi yukarida calistirdigimiz sorgulara ait sqlleri 
-- verdigimiz module adi ile sorgulayalim.
SELECT MODULE, ACTION, SQL_TEXT  FROM V$SQLAREA WHERE MODULE = 'MODULE:DEP_MAINTAIN';

Sorgu sonucunda module ve action kolonlarında setlediğimiz bilgileri görebilirsiniz.

2

 

 

READ_MODULE: Set edilen module ve action parametrelerini geriye döndürme işlemini gerçekler.

SET SERVEROUTPUT ON
DECLARE
   module_name   VARCHAR2 (100);
   action_name     VARCHAR2 (100);
BEGIN
   DBMS_APPLICATION_INFO.READ_MODULE(module_name,action_name);
   DBMS_OUTPUT.PUT_LINE ('Module:' || module_name);
   DBMS_OUTPUT.PUT_LINE ('Action: '  || action_name);
END; 

SET_SESSION_LONGOPS: Transactionımız bir long operation’a sebebiyet veriyor (Örneğin: Parallel Execution Vs.. )ise bu metod sayesinde V$SESSION_LONGOPS viewında ilgli transactiınımıza ait kaydı koyduğumuz belirteçler ile monitör edebilmemize olanak sağlar.

Evet yaptığımız örneklerden de anlaşılacağı gibi DBMS_APPLICATION_INFO paketini uygulamalarımız içerisinde kullanmak. Çalışan sorgularımızı monitör etmede ve trace etmede bize oldukça fayda sağlayacaktır. Aksi takdirde herhangi bir monitoring ihtiyacında  v$ ile başlayan tablolar içerisinde oldukça zorlanarak sorgulama işlemini gerçekleştirmek durumunda kalabiliriz.

Kaynaklar

https://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_appinf.htm#CHECEIEB

Advertisements

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