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/




12 Eylül 2014 Cuma

OEL 5.5 üzerinde Apex 4.1 'den 4.2' ye upgrade

1) Apex 4.2, aşağıdaki adresten download edilir.

http://www.oracle.com/technetwork/developer-tools/apex/downloads/index.html

2) Download edilen apex4.2.5.zip istenilen bir klasöre açılır.

3) Zip dosyanın açıldığı klasörde apexins.sql dosyası çalıştırılır.

sqlplus ile sys user kullanılarak bağlanılmalıdır.
apexins.sql dışarıdan 4 parametre alır : APEX user için kullanılacak tablaspace, FLOWS_FILES user için kullanılacak tablespace,TEMP tablespace, image klasörünün ismi.

$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.3.0 Production on Thu Jan 3 11:21:39 2013
 
Copyright (c) 1982, 2011, Oracle. All rights reserved.
 
SQL> @apexins.sql APEX APEX TEMP /i/

Benim makinemde komutun tamamlanması 16 dk. sürdü.
Sonrasında “APEX_040200″ kullanıcısının oluştuğunu görebilirsiniz.

4) Upgrade sonrası kontrol

Kurulum sonrası aşağıdaki query sonucu "VALID" olmalıdır.

$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.3.0 Production on Thu Jan 3 11:21:39 2013
 
Copyright (c) 1982, 2011, Oracle. All rights reserved.
 
SQL> select status from dba_registry where comp_id='APEX';
 
STATUS
-------------------------------------------------------
VALID

5) Image klasörünün ayarlanması

Kurulum sonrası, eski apex kurulumunuzun bulunduğu klasörün ismini değiştirin ve
yeni apex klasörünüzü buraya taşıyarak aynı ismi verin.
Sonrasında eski apex/images klasörünüzde bulunan manual yüklediğiniz resim dosyalarınızı
yeni apex/images klasörünüze kopyalayın.

6) Eğer Oracle 11g kullanıyorsanız ve mail atma gibi aksiyonlarınız varsa
ilgili network yetkileri “APEX_040200″ user için verilmelidir.

Aşağıdaki sql scripti sys user ile çalıştırılmalıdır.

DECLARE
ACL_PATH VARCHAR2(4000);
BEGIN
-- Look for the ACL currently assigned to '*' and give APEX_040200
-- the "connect" privilege if APEX_040200 does not have the privilege yet.
SELECT ACL INTO ACL_PATH FROM DBA_NETWORK_ACLS
WHERE HOST = '*' AND LOWER_PORT IS NULL AND UPPER_PORT IS NULL;
IF DBMS_NETWORK_ACL_ADMIN.CHECK_PRIVILEGE(ACL_PATH, 'APEX_040200',
'connect') IS NULL THEN
DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(ACL_PATH,
'APEX_040200', TRUE, 'connect');
END IF;
EXCEPTION
-- When no ACL has been assigned to '*'.
WHEN NO_DATA_FOUND THEN
DBMS_NETWORK_ACL_ADMIN.CREATE_ACL('power_users.xml',
'ACL that lets power users to connect to everywhere',
'APEX_040200', TRUE, 'connect');
DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL('power_users.xml','*');
END;
/
COMMIT;

Bu blog yazısını hazırlarken gerçekleştirdiğim upgrade
deneyimi yanısıra aşağıdaki adresten yararlandım.
İncelemeniz faydalı olabilir. 

https://matthiashoys.wordpress.com/tag/apexins-sql/