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;
RSS feed for comments on this post. TrackBack URL
MsSql de bu olay daha kolay yapılabiliyor ama oracleda da bu şekilde olduğunu görmek adına güzel çalışma olmuş.
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.
Tablolardaki kayıt sayılarını almak için uygulanabilir bir örnek. Ama burda amaç geriye tablo dönderen fonksiyonlara bir örnek vermek.
Geriye tablo döndürmek adına gözel bir örnek olmuş…