Table Function

Zaman zaman ihtiyaç duyarız geriye tablo dönderen fonksiyonlara. İşimizi oldukça kolaylaştırır. Bu konu ile ilgili örnek kod vermek istiyorum.Örneğimizde kendisine verilen koşullara uyan tabloların isimlerini ve kayıt sayılarını tablo olarak geriye dönderen bir fonksiyon oluşturuyoruz .Örnek fonksiyonumuzun kullanımı şu şekilde olacak

SELECT * FROM TABLE(FN_GETTABLES_ROWCOUNT(-1,'EMP%'))

çıktısı ise

TABLE_NAME STATISTIC_NUM_ROWS REAL_NUM_ROWS
EMPLOYEES 1457 1455

Öncelikle kullanıcınıza tip oluşturma yetkisi vermeniz gerekiyor.

GRANT CREATE type TO user_name

daha sonra tiplerimizi oluşturmaya başlayalım. Önce ilişkili objemizi oluşturuyoruz.

CREATE OR REPLACE TYPE type_tableinfo AS OBJECT
 (
table_name VARCHAR (30),
statistic_num_rows NUMBER, --tablonun son analizinde elde edilen satır sayısı
real_num_rows NUMBER --tablonun en son satır sayısı
);

daha sonra bu tipten oluşan tablo tipimizi oluşturuyoruz.

CREATE OR REPLACE TYPE type_tableinfo_table IS TABLE OF type_tableinfo;

işte buda fonksiyonumuz.

CREATE OR REPLACE FUNCTION fn_GetTables_RowCount (pMinRowCount NUMBER,pTableNameFilter VARCHAR)
   RETURN type_tableinfo_table
IS
   CURSOR crTables
   IS
      SELECT table_name, NUM_ROWS
        FROM tabs
       WHERE table_name LIKE pTableNameFilter;
 
   tmpCount      NUMBER;
   crTablesRec   crTables%ROWTYPE;
   result        type_tableinfo_table := type_tableinfo_table (NULL);
BEGIN
   result.DELETE;
 
   FOR crTablesRec IN crTables
   LOOP
      EXECUTE IMMEDIATE 'Select count(*) from ' || crTablesRec.table_name
         INTO tmpCount;
 
      IF tmpCount > pMinRowCount
      THEN
         result.EXTEND;
         result (result.LAST) :=
            type_tableinfo (crTablesRec.table_name,
                            crTablesRec.Num_Rows,
                            tmpCount);
      END IF;
   END LOOP;
 
   RETURN result;
END;
bookmark bookmark bookmark bookmark bookmark bookmark bookmark bookmark bookmark bookmark bookmark bookmark
tabs-top

4 Comments »

  1. MsSql de bu olay daha kolay yapılabiliyor ama oracleda da bu şekilde olduğunu görmek adına güzel çalışma olmuş.

    comment-bottom
  2. Alaettin Uçan Says:

    select ‘analyze table ‘ || table_name || ‘ compute statistics;’ from user_tables;
    burda kullanıcıya ait tüm tabloların istatistiklerini güncelleyecek sorgular oluşuyor. çıkan sonuçları alıp çalıştırmak gerekiyor.

    select table_name,num_rows from user_tables
    where num_rows=0
    order by 1;
    güncel istatistik sonuçlarına göre kayıt sayısı 0 olan tabloların listesini veriyor.

    comment-bottom
  3. admin Says:

    Tablolardaki kayıt sayılarını almak için uygulanabilir bir örnek. Ama burda amaç geriye tablo dönderen fonksiyonlara bir örnek vermek.

    comment-bottom
  4. ilhan KAZANCI Says:

    Geriye tablo döndürmek adına gözel bir örnek olmuş…

    comment-bottom

RSS feed for comments on this post. TrackBack URL

Leave a comment