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!

APEX: Send Mail Thru Report Page

Hi,

You published a useful interactive report for your users and now want to let them get that as email also 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 once it used.

Dag!

Yollarda: Yüz Örneklemeye Devam

Daha dogru tespitlerde bulunabilmemi saglamasi icin, tez calismamda kullandigim yuz fotograflarimin

  • Degisik yas gruplarindan,
  • Farkli cografi bolgelerden,
  • Her iki cinsiyetten

alinmasi gerekiyor.

Bu hafta duragimiz Tekirdag ‘in Muratli ilcesiydi :)

muratli_27032016
kameram ve ben!

 

Kafatasından Cinsiyet Ayrımı

IMG_7912 (1)

1. Nuchal crest erkeklerde belirgin; kadınlarda daha az belirgin

2. Mastoid process kadınlarda daha dar; erkeklerde daha geniş

3. Göz çukurları kadınlarda yuvarlak; erkeklerde dikdörtgensel

4. Glabella erkeklerde belirgin; kadınlarda daha az belirgin

5. Mental eminence kadınlarda daha sivri (bu nedenle mandibula sivri görünümde); erkeklerde geniş ve belirgin (bu nedenler mandibula önden daha dikdörtgensel görünümde)

6. Gonial açı kadınlarda genellikle 90 dereceden fazla; erkeklerde aşağı yukarı 90 derecedir.

Kimliklendirme

Bir bireyin tanınmasına ve diğer insanlardan ayırt edilebilmesine yarayan tüm özelliklerine kimlik; bu özelliklerin ortaya konması faaliyetine ise kimliklendirmedenir.

Kimliklendirme, hem canlıda hem de ölüde yapılabilir.

Kişinin kendiyle ilgili bilgi verecek durumda olmadığı durumlarda Canlı Kimliklendirmesi gerekebilir.

Bu duruma örnek olarak: koma, amnezi, akıl hastalığı gibi halleri sıralayabiliriz. Başlıca gereksinimler ise günümüzde çoklukla miras paylaşımı ve küçük yaşta evlendirme vakalarında karşımıza çıkar.

Ölülerde ise ceset tanınmaz durumda olduğunda kimliklendirme çalışmasına ihtiyaç duyulur. Bu durum

  • Cesedin parçalanmış olması,
  • Yanması
  • ya da ölüm sonrası değişimlere uğraması

Hallerinde karşımıza çıkmaktadır. Başlıca gereksinimler; uçak, tren, gemi kazaları ve afetler gibi kitlesel ölümlerin yaşandığı durumlarda karşımıza çıkar.

Bu girizgahın ardından Kimliklendirme işlemini iki temel sahaya ayırabiliriz:

i. Adli kimliklendirme
ii. Tıbbi kimliklendirme

Adli kimlik En temel ifade şekliyle nüfus cüzdanımızda yazan bilgilerimizdir. Kişinin üzerinden çıkan kimlik niteliginde bir belge ile yapılacak değerlendirme aynı zamanda yakınlarından alınacak yorumlarla çapraz kontrol edildikten sonra tutanağa geçirilir. Bu işlemde tanık onayı önemlidir. Tıbbi kimlik Tüm vücut özelliklerini kapsar.

* Fiziksel özellikler,
* Ameliyat/yara izleri,
* Leke,
* Dövme,
* Uzuvlarda eksiklik/fazlalık,
* Dişler (eksik, protez, dolgu vb)

Gibi özelliklerin tamamı tıbbi kimliklendirmede ayırt edici özellikler olarak değerlendirilir.

O halde Kimliklendirme Yöntemlerini teknik olarak şu şekilde sıralayabiliriz:

i. Tıbbi kimlik özellikleri, özellikler, deformite
ii. Kimlik belgeleri, fotoğraf içeren belgeler
iii. Tanıklık
iv. Giysi incelemesi
v. Özel eşyalar, protez, gözlük, işitme cihazı gibi..
vi. Diş özellikleri
vii. Parmak ve ayak izi
viii. Radyolojik inceleme
ix. İç muayene
x. Fotoğraf karşılaştırması: Merkezi kayıt sisteminde bulunan fotoğraflarla kişinin üzerinden çıkan belgelerden elde edilen fotoğrafların karşılaştırılması
xi. Fasiyal rekonstrüksiyon: Kafatası, yüz ve yumuşak dokunun yeniden oluşturulması
xii. Adli antropolojik çalışmalar: İleri derecede çürümüş ya da iskeletleşmiş cesetlerin kimliklendirilmesi için kullanılan yöntemler xiii. Kan lekeleri ve DNA çalışmaları: Adli hemogenetik çalışmaların güvenilirliği %99.99’lara kadar ulaşmıştır.

Bir sonraki yazımızda görüşmek üzere!

Adli Antropoloji’de Temel Sorular

Adli Antropoloji ile ilgilenenlerin birçok bilimsel yazıda karşılaştığı belli başlı sorular vardır.. Basit ve herkes tarafindan anlasilir bir dille bu sorular üzerinde kısaca duracağım.

Baslayalim..

Bir arazi ya da bir binanın arka bahçesi gibi bir alan düşünün. Burada kemik parçalari olduğunu düşündüğünüz nesnelerle karşılaştınız.

Sokak hayvanlarına bırakılan kemiklere benzetemediğiniz bu kalıntılar sizde şüphe uyandırdı. Bu şüpheyle eve dönmektense polisi arayıp en azından içiniz rahat etsin istediniz.

Polis bahsedilen alana geldi.

İlk incelemeler yapıldı.

Bu kalıntıların iskelet parçası olduğunu düşünen polis, alanı koruma altına alıp uzmanları çağırdı.

Uzmanlarımız olay yerine geldi ve ilk soruyla başladık:

 

Bulunan bu parçalar gerçekten de kemik mi?

 

Adli Bilim uzmanları tarafından kolaylıkla cevaplanabilir bir soru.. Degil mi?

Parçaların kemik olduğuna emin olunması halinde 2. soruya geçelim:

 

Kalıntılar insana mı ait?

 

Bir Adli Antropolog tarafından kolaylıkla cevaplanabilecek bir soru daha..

Çünkü insan ve hayvan iskeleti anatomik açıdan ayırt edici farklılıklar gösterir. Şekil ve uzunluk bu aşamada önemli etkenlerdir.

Uzmanımız iskelet parçalarının bir insana ait olduğuna karar verdikten sonraki sorumuz şu:

 

Bu kalıntılar bir kişiye mi ait; yoksa birden fazla mı?

 

Bu aşamada iskelet parçalarının sayısına ve boyutlarına göre bir gruplandırma yapılabilir.

Sonuçta ancak DNA analiziyle kaç kişiye ait olduğu kesin olarak belirlenir.

Elimizde bir kişiye ait iskelet kalıntısı olduğunu varsayalım.

Şimdi bu kalıntıları kimliklendirmemiz gerekir:

 

İskelet parçaları bir kadına mı; bir erkeğe mi ait?

 

İskeletten cinsiyet belirlemede morfolojik ve metrik yöntemler kullanılır.

Morfolojik yöntemde, daha belirleyici unsurlar içerdiğinden, çoğunlukla kafatası ve pelvisten (kalça kemiği) yararlanılır.

Eğer morfolojik tespit mümkün değilse metrik yönteme veya DNA analizine başvurulur.

Sıra geldi yaş tahminine:

 

Kalıntılardan cinsiyetini tahmin ettiğimiz birey kaç yaşlarında olabilir?

 

Öncelikle bebek/çocuk, genç ve erişkin olarak bir gruplama yapılır.

Çünkü bu aşamada her bir grup için ayrı yöntemler kullanılır.

Çocuklarda dişlere bakılır. 

Bu mümkün değilse uzun kemiklerin gövde uzunluklarına -epifiz- ve kaynaşmadurumuna bakılır.

Gençlerde epifiz plakta kaynaşmaya bakılır.

Diş bulunursa 3. moların gelişimine bakılır.

Erişkinlerde pelviste bulunan pubic symphisisin yüzeyine ve kenar değişimlerine bakılır.

Ayrıca kafatasında suturların kaynaşmasına, kaburgaların sternumla (göğüs kemiği) birleşme noktalarına, uzun kemiklerde spongioz (süngerimsi) dokuya, diş aşınmalarına ve pelviste auricula yüzeyine de bakılabilir.

Kimliklendirmede diğer bir soruda sıra:

 

Kişinin boyu ne uzunlukta?

 

Burada en çok matematiksel yöntem kullanılır. Uzun kemiklerden ölçüm yapılır. Bu yöntemin dışında anatomik, somatometrik ve eksik uzun kemiklerden yararlanılan yöntemler bulunmaktadır.

Kişinin ırk tahmini de yapmak gerekir. Bu konuya fazla değinmeyeceğim. Çünkü günümüz toplumlarında iskelet kalıntılarından ırksal ayrım yapmak çok net sonuçlar vermeyebilir.

Peki kalıntılarda patolojik bulgular var mı?

Bulunan iskelet parçaları üzerinde –varsa- tespit edilen patolojik bulguların şekli ve özellikleri tanımlanmalıdır.

Kalıntıları kaldırıldıktan sonra alan yeteri kadar incelendi mi?

Daha küçük kemik parçaları veya kişiyle/olayla ilgili bilgi sahibi olmamıza yarayacak bir takım bulgular elde edilebilir.

Son olarak:

Elde edilen iskelet kalıntılarının kayıt işlemleri yapıldı mı?

Bu başlı başına bir konudur.

Olay yerinde bulunan tüm veriler kayıt altına alınmalı ve doğru şekilde etiketlenerek usulünce kuruma gönderilmelidir.

Aslında her bir soru kendi içinde birer ders konusu niteliğindedir.

Bir giris yazisi oldugunu dusunerek, oldukça kısa ve açık tutmaya çalıştım. Sonraki yazilarimda her bir konuyu derinlemesine tartisacagim.

Sizlerin de yorum ve yonlendirmeleriyle degerli bir Turkce kaynak olusturmak, gerek ogrenciler ve akademisyen ya da uzman antropologlar ve gerekse konuya yalnizca ilgi duyan insanlar icin faydali olacaktir.

APEX: List of Values

Dag!

It is not the best way to place an input field on your report interface if there are only a certain amount of possible input values. Right?

Let ‘s say we want our users to enter a Currency Code to return the Currency Rate of it..

apex_lov_1
sample SQL

So you deployed that one to APEX as an interactive report..

Since we ‘ve a bind variable, there has to be page item on your report interface.. If you create your page item as TEXT field, it works just fine.

But the problem is, users can enter currency codes which are not exist :)

To avoid that, we can set the page item type as Pop-Up LoV.

apex_lov_5
Item Types

At some point, we will be prompted to define Values for our List.

apex_lov_6
List of Values Query/ Named LoV Selection

Now we have 2 + 1 options:

  1. We can create a static list. It can be useful if we have only a bunch of values and they really are static.
  2. We can write our query which will return 2 columns: Display Value, Return Value
  3. We would create a Shared Component so we can reuse it on other pages as well :)

Number one is quite easy.. Just type your values as it ‘s shown below, be careful with spelling.

apex_lov_7
Static Values

Number two is a one time solution. Meaning, if you want to do same thing for another interactive report, you ‘ll have to do it again.

Say we have a param table where we can get all possible ISO Currency Codes:

apex_lov_8
Sample Dynamic LoV Query

Once we use this simple query as LoV Query, indeed we ‘ll have a dynamic LoV object.

However, to make it more efficient, we can also create a shared component with it so we can could use that object on other pages too.

Go to Application Builder then select your Application and click to Shared Component link.

You ‘ll see some User Interface options there:

apex_lov_9
List of Values Menu

  • Pick the List of Values.
  • Start from scracth
  • Set a name
  • Click to Dynamic radio button.

Write or Paste your Dynamic LoV Query to the text box.

Complete these steps by following on-page instructions.

Great!

Now we have a generic LoV which will list all the possible Currency Codes in our environment.

Now go a few steps back.. As you can see from List of Values Query/ Named LoV Selection there is a yellow marked area called Named LoV.

Click on it and pick your freshly built LoV.

Finally our user can input the currency codes without typing them manually :)

apex_lov_4
Sample Pop-Up LoV

Cheers!