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/