APEX: dbms_scheduler

Bir sorgu hazirladiniz ve bu sorgudan donen sonucu periyodik olarak bir tabloya yazmak istiyorsunuz..

Ya da bu bir rapor ve bu rapora bakarak periyodik olarak bir kisi ya da ekibe mail gondermek istiyorsunuz..

APEX icinden nasil mail gonderilecegine dair kucuk bir ornegi su yazimda anlatmaya calismistim.

Simdi ise bunu “otomatik” hale getirmeyi deneyelim.

Farkli yontemler elbette var, ama ben -veri tabaninizin “eski” bir versiyonda olmadigini varsayarak- dogrudan dbms_scheduler uzerinden bir procedure ile ilerleyecegim.

i. Oncelikle sorgumuzu bir procedure haline getirerek objemizi olusturalim. Bunu APEX ‘in etkilesimli menulerine yaptirabilecegimiz gibi SQL konsolunda elle de yapabiliriz.

create or replace procedure “ORNEK_BASITMIS” is 

Sorgunun detaylari bu yazinin konusu degil. Fakat soz gelimi, belirli bir data setini dinamik olarak sececegimiz alicilara gondermek istiyorsak

  • Bir cursor acabilir,
  • Sonra bu cursor ‘i loop icinde %NOTFOUND oluncaya kadar fetch ederek aksiyonumuzu aldirabiliriz: mesela her defasinda bir email gondermek gibi.

Schedule etmeye karar verdiginiz islem sisteme periyodik olarak email gonderme isi vermekse ve ornek mail gonderme kismini burada isledigimiz gibi apex_mail.send uzerinden kotariyorsaniz, dikkat etmemiz gereken aslinda belki de tek onemli nokta su:

Hazirladiniz SP icinde BEGIN END arasinda APEX Workspace ID ‘nizi assign emelisiniz..

Aksi takdirde schedule ettiginiz Job ‘un calisma vakti geldiginde

ORA-20001: This procedure must be invoked from within an application session.

gibi bir hata ile karsilasirsiniz :)

apex_about

APEX Workspace ID

Bu ID bilgisine ustteki gibi erisebilirsiniz. Set etmek icin asagidaki gibi bir ifade kullaniyoruz:

wwv_flow_api.set_security_group_id();

 

Stored Procedure ‘imizi hazirladik ve ORNEK_PROCEDURE ismi ile create ettik diyelim. Simdi sirasi ile DBMS_SCHEDULER ile once bir program create etmeliyiz:

dbms_create_prog
DBMS_SCHEDULER.CREATE_PROGRAM

Ardindan bir schedule create ediyoruz:

dbms_create_sched
DBMS_SCHEDULER.CREATE_SCHEDULE

repeate_interval degiskenine dikkat edelim. Burada frekans, saat, dakika, saniye turunden bir cok deger verme sansimiz var..

Dolayisiyla, Ayin belirli bir gunu, Haftanin belirli gunleri, gunun belirli saatleri gibi spesifik periyod tanimlari yapabiliyoruz. Detayli bilgiye Oracle dokumanlarindan erisebilirsiniz.

Simdi de job create edelim:

dbms_create_job
DBMS_SCHEDULER.CREATE_JOB

 

Artik veri tabaninda bir SP ‘miz var ve bu SP ‘nin istedigimiz zaman araliklarinda otomatik calismasi icin bir Program tanimimiz, bir Schedule ‘imiz ve bir de Job ‘imiz var..

Simdi program ve job ‘imizi “acalim”.

dbms_enable
Enable

Hazir.. Artik repeat_interval olarak verdigimiz vakit geldigi zaman job ‘in calismadigini kontrol edebiliriz.

Mesela az once enable ettigimiz Job ‘u suradan gorebiliriz:

select * from dba_scheduler_jobs;

Zamani geldiginde islemin calisip calismadigini ise su tablodan takip edebiliriz:

select * from user_scheduler_job_run_details;

Yaptiklarimizi drop etmek icinse yine DBMS_SCHEDULER icindeki

  • drop_job
  • drop_schedule
  • drop_program

yapilarini kullanabiliriz. Fakat tahmin edebileceginiz gibi bunlari “sirali” yapmalisiniz, aksi takdirde sistem dependency nedeniyle kizacaktir :)

dbms_drops

DROP etmek..

Gorusmek uzere!

Advertisements

APEX: Send Mail Thru Report Page

Hi,

You published a useful interactive report for your users and now want to let them sending emails through that page.

Here you can find a basic example..

  • Go to your report page from Application Builder panel
  • Create a page item button 
    • Pick Defined by Dynamic Action as button action
  • Right click to your brand new Dynamic Action and select Create.
dyn_act
APEX Dynamic Action

As you can see above, we have to create this action with some conditions. Such as:

  • Event: Click
  • Selection Type: Button
  • Button: address your button which you ‘ve just created. This item will trigger your email sending process.

Once we completed these steps, we can add a True action. You ‘ll see a button named Add True Action at your Dynamic Action Edit page. You can also create one by choosing from right click menu.

true_act
Adding a TRUE action

You may want to uncheck Fire On Page Load. Because.. Well we want to trigger it by clicking our button, manually :)

So.. Now we need this PL/SQL code which will take care of sending email via Oracle APEX.

I ‘ll share 2 basic examples with you. One for plain-text emails, one for HTML based ones.

I personally prefer to send mails in HTML format… But it ‘s up to you and depends on your needs..

It is pretty easy, right? Just give the right parameters and a simple sentence as email body. You can always use variables to collect these informations like i did..

If you want to go with HTML format, then you ‘ll need some extra time to create a good-looking and small-sized body. That ‘s all :)

Once you store these codes you ‘ve wrote and apply the changes onto your report page, you can start using your button. It should be sending emails to given address. Click on your button and wait couple of minutes to receive it.

I am not going to remind you not to copy everything from my sample snapshots. You do need to change email addresses etc. :)

Should you want to add some extra features on this dynamic action, you can add another True action(s) as well.

You may need to.. Otherwise someone would be able to click on that button more than necessary and we don ‘t want to spam people :)

Let ‘s add a Confirmation action..

 

conf_act

  • Right Click, Create
  • Action: CONFIRM

Now you ‘ll be prompted to click OK everytime you click on your email button..

O.K. but not enough? Well let ‘s hide the button after it ‘s got clicked.

hide

  • Now we have a button on our report page
  • Our authorized report viewers can click on it to send email
  • We have a confirmation dialog before trigger
  • Our email send button will be hidden right after our user click on it.

Dag!

SQL Plus: Generating Delimited Files

Hoi!
Say you need to dump a special set of data into a file..

Sure you can do that with fancy SQL clients which have graphical user interfaces. However, sometimes you do need to export your data set into a plain text file in a *certain* format, via sqlplus.

In some cases, for instance, if you ‘re going to use that file to feed another system, you ‘ll have to follow that 3rd systems data delivery rules. There can be some restrictions such as

  • Maximum line size
  • End of Line characters
  • Default Character Set
  • Pages
  • Spaces

etc.

So, since we are using sqlplus for our action, better prepare our query as a script.. I won ‘t explain all of these definitions, but it ‘s quite easy to find out what they do :)

Let ‘s write our .sql script by starting these SETs:

SET LINESIZE 300;
SET TERMOUT OFF;
SET ECHO OFF;
SET NEWP 0;
SET SPACE 0;
SET PAGES 0;
SET FEED OFF;
SET HEAD OFF;
SET TRIMS OFF;
SET TAB OFF;
SET SERVEROUTPUT ON;
SET SQLBL OFF;
SET RECSEP OFF;

If you think you don ‘t need some of them, just put a dash before the line to make it disable.

As you can imagine, first one is the one that you defined the maximum length of a line in your output file.. Needless to say, you should read the specs of that 3rd system before setting it :)

Then we need to enter a path to address the exported file ‘s location.

 

spool D:\EXPORTS\export.txt

 

you can place your sql query after this line. For example

 

SELECT 1
FROM dual;

 

then we will have to tell that the spooling has to stop, and script ‘s got to exit.

 

spool OFF;
exit;

 

Now we can save this file as an .sql file.

It would be a wise idea to test it. Run sqlplus on your terminal screen.

Most of us are using GUI tools for our daily works. If you don ‘t know how to run it, believe me it ‘s quite normal :)

On Windows, START > RUN > CMD

It will open a terminal window. Then use that syntax with your own parameters.

 

c:\> sqlplus user/pass@database_IP:port/service

 

On GNU/Linux, start eterm, xterm or any terminal you like :)

Can you see SQL> prompt? If yes, you are almost done. Otherwise you ‘ll have to google it :)

Well, let ‘s try to execute our script now.

 

SQL> @c:\example.sql

 

This should work.. Now we can check our spool output folder..

If you are using a Windows and everything was fine so far, maybe it ‘d be better to create a .BAT to make this whole process easier.

Write these lines in notepad,

# sample BATCH file
SET NLS_CHARSET = UTF8
c:\> sqlplus user/pass@database_IP:port/service @c:\example.sql
exit

..save the file with the .BAT extension.

Now you can use your Task Scheduler to execute that batch file automatically.

Hope it helps.. Next time maybe we can talk about configuring your Task Scheduler.

Cheers!

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 :)