ORACLE PL/SQL – OBJECT TYPE -2 USING PL/SQL OBJECT “TYPE LIST”

Denizi bir testiye dökersen ne alır?

:Bir günün kısmetini –Mevlana

 

Merhaba
Önceki makalemizde object type’ları incelemiştik.(Buradan inceleyebilirsiniz) Bu makalemizde de object type’ların list özelliğini inceleyeceğiz
Herzaman ki gibi önce create. Hadi type ve type listimizi create scriptini yazalım.

---create type
create or replace type t_key_value as object 
(
key    varchar2(1000),
value  varchar2(4000)
)
/

 

-- create type (List<>)

create or replace type t_key_value_list as table of t_key_value;
/

 

type’ı referans alan bir liste oluşturmuş olduk aslında.
Şimdi bunları nasıl kullanacağız onu inceleyelim.
Kısa bir özet geçeyim.
Öncelikle bir for dongusu kuruyoruz. bu dondu 1 den 7ye kadar(7 de dahil) çalışacak.
bu for dongusunda gelen deger 1 ise pazartesi, 2 ise salı, 3 ise çarşamba… olacak şekilde
v_day diye bir değişkenimize değer atıyor. burada farklı olarak case kullanıyoruz(Buradan case kullanımını inceleyebilirsiniz)
buraya kadar fasa fiso….
Burdan sonra artık v_kv type’ımıza değer ataması yapıyoruz(Bu konuyuda buradan inceleyebilirsiniz)

type’ı doldurduktan sonra, v_kv_list’i extend edip, oluşturduğumuz type’ı index vererek atıyoruz.
daha sonra verdiğimiz bu index’ten geri okuyacağız

Burada iki for döngüsü var, biri yazar biri okur.
Her kodun yanına comment eklemeye çalışıyorum ki, sıfırdan başlayan insanlarda anlayabilsin diye
Faydalı olabilmek ümidiyle

 

-- Created on 14.05.2015 by Cevheri 

declare
  v_kv      t_Key_Value := t_Key_Value(null, null); -- oncelikle type degiskenimizi tanımlıyor ve initialize ediyoruz
  v_kv_list t_key_value_list := t_key_value_list(); -- key value type'ının listesini olusturmustuk onu tanımlıyoruz
  v_day     varchar2(10) := null; -- gunlerin isimlerini tutabilmek icin ayrı bir degisken tanımladık case fonksiyonu ile buna deger atayacağız
begin
  -- WRITE TYPE
  -------------------------------------------------
  -- Yedi kez donecek bir for döngüsü oluşturuyoruz
  dbms_output.put_line('------ Deger Atama  ------');
  for r in 1 .. 7 loop
    ------------------------
    -- gelen degere gore gunun ismi ilgili degiskene atilacak
    case r -- r for dongusundeki donus degerini alır o yüzden ayrıca bir degisken tanımlamaya gerek yok
      when 1 then
        v_day := 'PAZARTESI';
      when 2 then
        v_day := 'SALI';
      when 3 then
        v_day := 'CARSAMBA';
      when 4 then
        v_day := 'PERSEMBE';
      when 5 then
        v_day := 'CUMA';
      when 6 then
        v_day := 'CUMARTESI';
      when 7 then
        v_day := 'PAZAR';
      else
        v_day := null; -- olmaz ama her zaman siz kodunuzu yazarken ELSE'yi düşünün ve yazın...
    end case;
    ------------------------
  
    -- oncelikle type degiskenimi dolduruyoruz....  
    v_kv.key   := r;
    v_kv.value := v_day;
    ------------------------
    -- object type listimizi extend edip, içine type basacağız. 
    v_kv_list.extend;
    v_kv_list(v_kv_list.count) := v_kv; -- index vererek type'ı refere ediyoruz.
    ------------------------
  
    dbms_output.put_line('Atanan Key   :' || v_kv.key);
    dbms_output.put_line('Atanan Value :' || v_kv.value);
  end loop;
  
  dbms_output.put_line('-----------------------------');
  -- END WRITE-------------------------------------

  --**************************************************************

  -- READ TYPE-------------------------------------
  
  v_kv := null;
  dbms_output.put_line('-------  Deger Okuma   ------');
  -- hadi artık, doldurulan listelerin içindeki değerleri okuyalım
  for r in v_kv_list.first .. v_kv_list.last loop
  
    v_kv := v_kv_list(r); --- yine index vererek okuyoruz....
  
    dbms_output.put_line('Okunan Key   :' || v_kv.key);
    dbms_output.put_line('Okunan Value :' || v_kv.value);
  end loop;
  
  dbms_output.put_line('----------------------------');
  -- END READ-------------------------------------

end;

Selam ve Dua ile…

ORACLE PARTITIONING UZERINE BASIT BIR ORNEK

Altın ne oluyor, can ne oluyor, inci, mercan da nedir,
bir sevgi’ye harcanmadıktan, bir sevgiliye feda edilmedikten sonra –Mevlana

Merhaba

Bugün sizlere, yaptığım küçük bir örneği göstermek istedim. Umarım faydası dokunur.

Bu yazımızda bir tabloyu Hash partitioning yaparak; 10 parçaya bölüyorum, ve her parçayı ayrı ayrı ele alabiliyorum. buda tahmin edeceğiniz gibi performansı ciddi anlamda artıracak, tek tablo üzerinde multi threading çalışma imkanı verecektir.

Şimdi bunun nasıl yapılacağını -Kısa / Öz / Basit – Bir örnekle anlatalım.

Önce Tablomuzu oluşturalim.

SQL> CREATE TABLE tmp_cevheri
    (id  number)
    PARTITION BY HASH (id)
    PARTITIONS 10
    ;
Table created

——————————————————————————————–

nologging olarak alterleyeceğim. biraz sonra içine yüklü bir kayıt basacağım.

-- loglanmamasını sağla
SQL> alter table tmp_cevheri
    nologging
    ;
Table altered

——————————————————————————————–

deneme bir log tablosunun kayitlarini  “append” ile basiyorum

 

SQL> insert /*+ append */ into tmp_cevheri select id from smart_home_tempr_sensors_log
10380039 rows inserted 3 second

SQL> COMMIT;
Commit complete

hızımız bir append, ikincisi de nologging’e borçluyuz

——————————————————————————————–

Kayıtlarımız tabloya atıldı mı?

SQL> Select count(1) from tmp_cevheri; 
  COUNT(1)
----------
  10380039

——————————————————————————————-

Partition isimlerini Bulalım

SQL> select t.partition_name, t.partition_position 
     from DBA_tab_partitions t where t.table_name = 'TMP_CEVHERI';

PARTITION_NAME                 PARTITION_POSITION
------------------------------ ------------------
SYS_P354                                        1
SYS_P355                                        2
SYS_P356                                        3
SYS_P357                                        4
SYS_P358                                        5
SYS_P359                                        6
SYS_P360                                        7
SYS_P361                                        8
SYS_P362                                        9
SYS_P363                                       10

——————————————————————————————-

— Her Partitiona ait kayıt sayılarını artık görebiliriz ve bunlar üzerinde istediğimiz taklayı atabiliriz…

SQL> select 'PARTITION_1', COUNT(*) from tmp_cevheri partition(SYS_P354) -- 647.638 kayıt var
   UNION ALL
   select 'PARTITION_2', COUNT(*) from tmp_cevheri partition(SYS_P355) -- 647.991 kayıt var
   UNION ALL
   select 'PARTITION_3', COUNT(*) from tmp_cevheri partition(SYS_P356) -- 1.298.968 kayıt var
   UNION ALL
   select 'PARTITION_4', COUNT(*) from tmp_cevheri partition(SYS_P357) -- 1.296.682 kayıt var
   UNION ALL
   select 'PARTITION_5', COUNT(*) from tmp_cevheri partition(SYS_P358) -- 1.297.725 kayıt var
   UNION ALL
   select 'PARTITION_6', COUNT(*) from tmp_cevheri partition(SYS_P359) -- 1.297.370 kayıt var
   UNION ALL
   select 'PARTITION_7', COUNT(*) from tmp_cevheri partition(SYS_P360) -- 1.299.352 kayıt var
   UNION ALL
   select 'PARTITION_8', COUNT(*) from tmp_cevheri partition(SYS_P361) -- 1.297.406 kayıt var
   UNION ALL
   select 'PARTITION_9', COUNT(*) from tmp_cevheri partition(SYS_P362) -- 648.647 kayıt var
   UNION ALL
   select 'PARTITION_10',COUNT(*) from tmp_cevheri partition(SYS_P363) -- 648.260 kayıt var
   ;
   
'PARTITION_1'   COUNT(*)
------------- ----------
PARTITION_1       647638
PARTITION_2       647991
PARTITION_3      1298968
PARTITION_4      1296682
PARTITION_5      1297725
PARTITION_6      1297370
PARTITION_7      1299352
PARTITION_8      1297406
PARTITION_9       648647
PARTITION_10      648260
10 rows selected

Partitioning işlemi sadece bu kadarla kısıtlı değil tabi. Bir makalede anlatılabilecek kadar da kısa değil.  Ben çalıştığım bir örneği sizinle paylaşarak, konuyu basitçe anlatmaya çalıştım. İnşaallah fırsat buldukça yine bu konuda örneklerle size konuyu anlatmaya çalışacağım.

Detaylı incelemek isteyenler için : http://docs.oracle.com/cd/A64702_01/doc/server.805/a58227/ch_pti.htm

Selam ve Dua ile…

 

PL/SQL Pivot Sorgu (Pivot Table Ozelligi)

Merhaba,

Bugünkü yazımızda sql ile pivot sorgu özelliğini yapacağız. Eminim çok seveceksiniz. Excel’den alışkın olanlar bilirler. Çok harika bir özelliktir.

Biz firmaların illere göre dağılımını ele alacağız örnek çıktı şu şekilde olacak

FIRMAADI Konya Ankara İstanbul
Analiz Firması 0 1 0
Bakım 0 0 1
Global 0 0 1
Proje Firması 1 0 0
Satış Firması 0 0 1
Test Firması 0 0 1
Yazılım Firması 0 1 0

Sorgumuz da aşağıdaki gibi olacaktır.

select *
  from (select f.firmaadi, i.adi
          from firma f, ililce i
         where f.ilid = i.plakakodu
           and i.ilcekodu = 0) 
 pivot(count(*) for adi in('Konya', 'Ankara', 'İstanbul'))
 order by firmaadi;

İşte bu kadar basit. Artık bir istatistik verirken daha rahat edeceksiniz.