9 Şubat 2015 Pazartesi

Oracle APEX üzerinden bir veritabanı prosedürü çalıştırmak

Merhaba,

Geçenlerde APEX ile geliştirilmiş bir B2B sitesine kredi kartı alışveriş eklentisi işi ile uğraştım.
Bu sırada banka geri dönüş değerlerini yakalamak için yaptığım araştırmada, bu işi direkt olarak 
çalıştıracağım veritabanı prosedürü ile yapabileceğimi öğrendim. Bu ve sonraki yazıda bu konudaki
ayrıntıları bulacaksınız.
  
B2B sisteminde kullanılan yazılım ve versiyonu 11g Express Edition , Apex 4.2.5 , Oracle Enterprise Linux6, Oracle Glassfish 4 şeklinde.Ama bu yöntem diğer versiyonlarda sorunsuz çalışacaktır.

Buradaki amacım aşağıdaki procedürü web üzerinden  bazı parametreler ile çalıştırmak. 
"name_array" ve "value_array"  parametrelerinin veri tipleri array yani dizi. Bunun nedeni
komut satırından bilinmeyen sayıda gelen parametrelerin tamamının bu dizi değişkenler içerisine 

alınması sağlamak. Ayrıca dışarıdan sınırsız sayıda alınan parametreler buradaki gibi dizi içerisinde 
saklanacak ise bu parametre isimleri mutlaka "name_array" ve "value_array" olmak zorunda.

CREATE OR REPLACE PROCEDURE test1 (name_array    IN owa.vc_arr,
                                                    
value_array   IN owa.vc_arr)IS
  
i   INTEGER;BEGIN
   FOR
i IN 1 .. name_array.COUNT
  
LOOP
      htp.p
('name_array ' || to_char(i) || '=' || name_array(i) || ' -- value_array ' || to_char(i) || '=' || value_array(i));
  
END LOOP;END;


Prosedürümüze aşağıdaki gibi yetki veriyoruz.

GRANT EXECUTE ON test1 TO PUBLIC

Ardından "APEX_040200"."wwv_flow_epg_include_mod_local" prosedürünü aşağıdaki gibi değiştirerek 
yeniden derliyoruz.


CREATE OR REPLACE FUNCTION APEX_040200.wwv_flow_epg_include_mod_local(
    
procedure_name IN VARCHAR2)RETURN booleanIS
BEGIN
    
--return false; -- remove this statement when you modify this function        BU SATIRI CALISMAZ HALE GETIRDIM
    --
    -- Administrator note: the procedure_name input parameter may be in the format:
    --
    --    procedure
    --    schema.procedure
    --    package.procedure
    --    schema.package.procedure
    --
    -- If the expected input parameter is a procedure name only, the IN list code shown below
    -- can be modified to itemize the expected procedure names. Otherwise you must parse the
    -- procedure_name parameter and replace the simple code below with code that will evaluate
    -- all of the cases listed above.
    --
    --PROCEDURE ISMINI BURAYA EKLIYORUZ
    
IF UPPER(procedure_name) IN (
          
'TEST1') THEN
        RETURN
TRUE;
    
ELSE
        RETURN
FALSE;
    
END IF;END wwv_flow_epg_include_mod_local;


Bu aşamadan sonra PLSql prosedürümüze web üzerinden ulaşıp istediğimiz sayıda parametre gönderebiliriz.
Aşağıdaki çalışan örnek link ve konu ile ilgili yardımcı olabilecek linkleri bulabilirsiniz.

http://vtakademi.com/ords/!dbapro.TEST1?p_test1=merhaba&p_test2=D%C3%BCnya

http://docs.oracle.com/cd/B19306_01/server.102/b14337/concept.htm#sthref41

https://matthiashoys.wordpress.com/2013/02/22/http-404403-executing-apex-procedure-from-url-with-oracle-11g-xe/