Cool stuff with partition elimination

Learning is not a spectator sport

Sometimes in the IT world, the term “surprise” is not a good one.

“I woke up this morning and got a …my database was down.”

“I ran a SELECT COUNT(*) on my most important table, and got a result of zero rows.”

and so forth. Generally as IT professionals, encountering the unexpected is not a good start to the day Smile.

But sometimes, surprises can be a nice thing.  Here is my example for today – when I found that the database can do a remarkably good job when it comes to reducing the workload with partitioned tables.  

Most people will already be familiar with the concept of partition elimination.  If you have a table partitioned into (say) yearly segments, and you ask for all of the data for the past 2 years, then the optimizer is intelligent enough to only scan the relevant partitions rather than the entire…

View original post 698 more words

Advertisements

note to mezelf: chunk CLOB?

Ever had a trouble while you were trying to print a variable, got an ORA-06502 error?

ORA-06502: PL/SQL: numeric or value error string

Cause: An arithmetic, numeric, string, conversion, or constraint error occurred. For example, this error occurs if an attempt is made to assign the value NULL to a variable declared NOT NULL, or if an attempt is made to assign an integer larger than 99 to a variable declared NUMBER(2).

Action: Change the data, how it is manipulated, or how it is declared so that values do not violate constraints.

If your variable is a CLOB it might be confusing as it was for me..

However, you ‘ll figure out the reason soon enough: Those string parts that you were collecting are bigger than 32K

And you ‘ll realize that you should tell it what to do.

Here is what I came across to. A big and special thanks to oracle forums, of course :)


PROCEDURE chunk_clob(p_clob CLOB) IS
v_buf_size VARCHAR2(32000);
v_offset PLS_INTEGER DEFAULT 1;
v_size PLS_INTEGER;
v_len PLS_INTEGER;
v_chunk PLS_INTEGER;
v_clob CLOB := p_clob;
BEGIN
v_chunk := dbms_lob.getchunksize(v_clob);
v_len := dbms_lob.getlength(v_clob);
WHILE v_offset v_chunk
THEN v_size := v_chunk;
ELSE v_size := v_len - (v_offset - 1);
END IF;
v_buf_size := NULL;
dbms_lob.READ(v_clob, v_size, v_offset, v_buf_size);
htp.prn(v_buf_size);
v_offset := v_offset + v_size;
END LOOP;
END;

– OKAY what is this and what am I going to do with this?

It ‘ll take care of your oversized strings so you get to see what your VAR has in it.


my_pck.chunk_clob(l_show_html);

APEX: Etkilesimli Grafikler

Merhaba,

Bu yazimda sizlere APEX grafik raporlarindan bahsedecegim.

Bildiginiz gibi, interaktif olarak hazirladiginiz raporlariniz icin Action menusu yardimiyla analiz sayfanizda anlik rapor gorselleri alabiliyorsunuz.

Fakat veri setimizi kalici bir rapor olarak da; pasta dilimi ya da bar seklinde kullanicilarimiza sunmak isteyebiliriz.

Bunun yaninda kullanicinin raporda gordugu alanlara tiklamasi ile ilgili alani olusturan data setini ayni ekranda ya da ikinci bir tab ‘da verebiliriz.

Bu sekilde son kullanicilariniza tum detay kirilimlari bir seferde vererek koca bir set cikmak yerine, ise ozet ve bir bakista anlasilan bir gorsel sunarak baslamis oluruz.

Kullanici, yapacagi analiz dogrultusunda raporu dig edebilir, bir alt kirilima inebilir, raw data icinde bogulmamis olur.

Alttaki ornegimizi inceleyelim:

Elimizde farkli urun tipleri ve doviz cinsleri var. Para turlerine gore urun hacimlerimizi gruplayarak grafik haline getiriyoruz.

Sekil.1: Ornek Grafik

Simdi biraz basa donelim.

Page Region ‘imiza sag tiklayarak Create secenegini secelim,

Gelen secenekler arasindan Chart ‘i isaretleyelim

Sonra ne tur bir grafik olusturmak istedigimizi secelim. Benim ornegim 3d Stacked Column.

Gerekli secimleri yapip grafigimize bir isim verdikten sonra sistem bizden Query isteyecek.
Aslinda alttaki gibi bir sonuc donduren basit bir SQL sorgu yazmamiz gerekiyor.
Veri yapimizi taniyorsak ve ne istedigimizi biliyorsak oldukca kolay:)
Tek yapmaniz gereken uygun bir sekilde veri setinizi gruplara ayirmak.. Ustteki ornegi inceleyerek kendi ihtiyaclariniza gore uyarlamayi deneyin.
Grafik raporlar icin hazirladigimiz sorgularin belirli bir desene gore donmesi gerekiyor. Sistem sizden ilk sirada Link kolonunu gondermenizi bekleyecek.
Bu kolonu:
  1. Hic kullanmayabiliriz, yani NULL gondeririz. Kullanici rapordaki barlara ya da pasta dilimlerine tiklayinca hic bir sey olmaz.
  2. Kullaniciyi baska bir sayfaya yonlendirecek sekilde kullanabiliriz. Bu durumda Link kolonuna yine NULL gonderiyoruz, fakat rapor ayarlarimizdan bir takim ayarlar yapmamiz gerekiyor.
  3. Link kolonuna URL gonderebiliriz. Bunu yapmak icin kucuk bazi dinamik sql cumleleri yazmamiz gerekiyor.
Bu yazimda 2. madde uzerinden gidelim, bir dahaki yazimda da 3. maddeyi orneklerle aciklamaya calisayim.
Oncelikle grafigimizdeki barlardan birine tiklandiginda acilmasini bekledigimiz detay rapor nedir, buna karar vermemiz gerekiyor.
Madem grafigimiz farkli doviz cinslerine gore urun hacimlerimizi gosteriyor dedik, o halde detay raporun da soyle bir sey oldugunu kabul edelim.

Bu sorgu calisinca sistem kullanicidan :pv_currency degiskenini bekleyecek. Bu sorguyu yeni bir interaktif rapor olarak kaydedelim.

Tabii ki :pv_currency icin bu yeni interaktif rapor sayfamizda Page Item, Page Item Button olusturmamiz gerekecek, bunlari da atlamalayim.

Simdi tekrar Grafigimize donuyoruz..

 

Chart Series olarak hazirladigimiz sorguya cift tiklayalim, ustte gordugunuz alani bulalim.
Dikkat ederseniz Target olarak Page in this Application sectik. Dolayisiyla artik grafigimiz, uzerine tikladigimizda o esnada calismakta oldugumuz Application icinden farkli bir sayfayi calistirmasi gerektigini biliyor.
Page menusunden detay olarak hazirladigimiz sorguyu deploy ettigimiz sayfayi gosterelim.
Alttaki Item seceneklerinden de bu “farkli” raporu hangi parametrelerle calistiracagini soyleyelim.
Ornek sorgumuzu hatirlayin: Sorgumuz bizden :pv_currency degiskenini bekliyordu.
Item 1 kutusunun yanindaki arama ikonuna tikladiginizda PV_CURRENCY degiskenini goreceksiniz.. Tabii Page menusunden detay sorgunuzun sayfa numarasini dogru vermisseniz. :)
ITEM 1 olarak PV_CURRENCY degiskenini isaret ettik.. Simdi de grafigimizdeki hangi degeri PV_CURRENCY item ‘ina Value olarak gonderecegimizi belirtelim:
Elimizde Link, Label ve Value kolonlari oldugunu hatirlayin. Benim ornegimde Label kolonunda doviz kodlarini siralamistim, zaten raporum da doviz kodlarina gore gruplanmis hacimleri gosteriyordu.
Bu nedenle ben Value olarak LABEL kolonunu seciyorum.
Bu sekilde kaydedip raporu calistirin ve farkli para kodlarina gore olusmus barlardan birine tiklayin.
Gelen sayfada yalnizca o doviz kodu icin filtrelenmis detaylari goreceksiniz.

Iyi calismalar :)

APEX: Coklu Secim

Evet.. Raporlama, data analizi, monitoring gibi ihtiyaclarimiz icin Oracle ‘in Application Express ‘ini kullaniyorsunuz.

Simdi kullaniciya bolum kodu secebilecegi bir menu verdiginizi ve buna gore sorgunuzun calistigini dusunun.

 

WHERE bolum_kodu = :pv_bolumkodu

 

Peki, kullanicimizin ayni anda birden fazla bolum kodu secebilmesini istersek?
Elbette

 

WHERE bolum_kodu in (:pv_bolumkodu_1, :pv_bolumkodu2, :pv_bolumkodu3)

 

gibi degiskenlerimizi cogaltabiliriz. Ama ortada onlarca ya da daha fazla secenek varsa her olasilik icin bir degisken tanimlayacak degiliz :)

Ekrana bir Shuttle ya da coklu secime izin veren bir Select List koyarak kullanicidan birden fazla input parameter almak istedigimizi ve bu listenin n secenek icerdigini dusunelim.

Ornek.1 ‘deki gibi, Interaktif raporunuza sag tiklayarak Create Page Item secenegi ile bir Shuttle ekledigimizi varsayalim..

Ornek.1

olusturdugumuz Page Item ‘in adini, sorgumuzda kullandigimiz degisken gibi PV_BOLUMKODU olarak verelim.

Ardindan Static ya da Dynamic menu icerigi hazirlamamiz gerekecek.

Bunlari da tamamladiktan sonra yine Ornek.1 ‘de gorulen Create Page Item Button secenegi ile bu kez de sayfamiza bir buton yerlestirelim.

Tum bu temel hazirliklarin ardin, raporumuzu calistirmak icin

butona basildiktan hemen sonra, ama raporun execute edilmesinden de hemen once 

calisacak sekilde bir page process yazmamiz gerekecek.

O halde uygulamamiza Ornek.2 ‘de gorulecegi gibi bir Page Process ekleyelim.

Ornek.2

Temelde ihtiyacimiz olan sey kullanicinin secimlerini not edip, bu bilgiyi query ‘miz her calistiginda kosul olarak sorgumuza “soyleyebilmek”..

Bunu yapmak icin aklimiza bir cok -pratik ya da kompleks- ozgun cozum gelebilir. Fakat Oracle ‘in bu tur istekleri karsilamak uzere sundugu yapiyi da kullanabiliriz..

Bunun icin Page Process ‘imizin PLSQL blogunda string ‘imizi table ‘a donusturmek uzere bir seyler yazmayi deneyelim..

 

DECLARE

pv_secim apex_application_global.vc_arr2;

BEGIN       

pv_secim := apex_util.string_to_table (:pv_bolumkodu);

apex_collection.create_or_truncate_collection (‘pv_shuttle’);

apex_collection.add_members (‘pv_shuttle’, pv_secim );

END;

 

 

Ben bu islemi yalnizca menu secimini “hatirlamak” icin kullanmak istiyorum.. O yuzden secimi gercek bir tabloya yazmak yerine APEX_COLLECTION ile biriktirmeyi tercih ettim.
pv_secim degiskenimiz APEX_COLLECTION sayesinde, ekranda pv_bolumkodu ile gelen bind variable ‘lari row by row saklayacak.
Shuttle menunuzden:
  • a
  • b
  • c
  • d

 

olmak uzere 4 satir secmisseniz, secimleriniz a:b:c:d seklinde siralanacaktir.

Ustte yazdigimiz BEGIN END blogumuzu calistiralim ve PV_BOLUMKODU soruldugunda a:b:c:d girelim.

Statement calistiktan sonra
SELECT *
   FROM apex_collections;
tablosundan sonucu izledigimizde Ornek.3 ‘teki gibi bir goruntu aliyor olmaliyiz.
Ornek.3
Ne yapmaya calistigimizi anlamissinizdir :) Sonrasi oldukca kolay:
WHERE bolum_kodu = :pv_bolumkodu
demek yerine, artik
WHERE bolum_kodu in (SELECT c001 FROM apex_collections WHERE collection_name = ‘PV_SHUTTLE’)

diyebiliriz.