29 Mart 2018 Perşembe

Custom CSV download with an AJAX Callback


You can find custom CSV download steps below. (Without submit)

The button to download.


Ajax Callback process in the page.




(Type Ajax Callback) Process body is ;

begin
htp.p('Content-type: text/csv');
htp.p('Content-disposition: attachment;filename=ledger.csv');
owa_util.http_header_close;

htp.p('"Emp No","Emp Name"');

for i in (
select empno, ename
  from emp)
    loop
      htp.p('"'||i.empno||'","'||i.ename||'"');
    end loop;
end;

28 Mart 2018 Çarşamba

Apex - Change a Button to a Link

Firstly, You need a copy "text" button template as "link".


And then you can use your new template on a button. 


15 Mart 2018 Perşembe

Creation of JSON object with APEX_JSON package

BEGIN
    APEX_JSON.initialize_clob_output;
    apex_json.open_object;        -- {
    apex_json.write('a', 1);    --   "a":1
    apex_json.open_array('b');  --  ,"b":[
    apex_json.open_object;    --    {
    apex_json.write('c',2); --      "c":2
    apex_json.close_object;   --    }
    apex_json.write('hello'); --   ,"hello"
    apex_json.write('world'); --   ,"world"
    apex_json.close_all;          --  ]
                          -- }
    DBMS_OUTPUT.put_line(APEX_JSON.get_clob_output);
    APEX_JSON.free_output;                     
END; 

Email validation for Apex

You can use below regexp expression for email validation in your apex applications.

^[A-Za-z_-]+[A-Za-z0-9._-]+@[A-Za-z0-9._-]+\.[A-Za-z]{2,4}$



12 Mart 2018 Pazartesi

Oracle Apex Standart Report Download Link Problem


Problem was related with download link and 
somehow download link's checksum was missing.
When I removed "Page Item to Submit" property value, it solved.
I faced with this problem at Apex Version 5.1.3.00.05.
 

26 Şubat 2018 Pazartesi

Oracle sleep func in Apex

APEX_UTIL.PAUSE(5); --sleep for 5 second

Setting Session State with PL/SQL

APEX_UTIL.set_session_state(p_name => 'PX_MY_ITEM', p_value => 'wibble');

Implement a busy modal indicator in Oracle Apex

At the start of your processing, execute (javascript):
    apex.widget.waitPopup()

And when done, just remove the elements (again, javascript): 
    $(".u-Processing,#apex_wait_overlay").remove();

11 Ağustos 2016 Perşembe

Oracle Apex - Shuttle için where clause

Shuttle nesnesi kullanırken aşağıdaki where cümleciği örneğini kullanabilirsiniz.

 select .....   
 from ......  
 where  
 ..... önceki koşullarınız.....   
 and  
 (  
   :P1_MY_SHUTTLE is not null and  
   (instr(':'||:P1_MY_SHUTTLE ||':',':'|| f.component_id||':',1) > 0 )   
 )  

Oracle Apex - Shuttle item için genişliğin değiştirilmesi

Bazı durumlarda shuttle nesnesinin genişliğini değiştirmek gerekibiliyor.
Bunu yapmak için shuttle item için edit butonuna bastıktan sonra
"HTML Form Element Attributes" özelliğini aşağıdakine benzer
şekilde değiştirebilirsiniz.


 HTML Form Element Attributes: style="width:250px"  

Bir kolon içerisinde tekrarlayan verinin tekilleştirilmesi (distinct)

Önce
------------------------------
 select group_id,   
     listagg(name, ',') within group (order by name) as names  
 from demotable  
 group by group_id   

 group_id names  
 -------- -----  
 1     'Alan, David, David, John'  
 2     'Charles, Julie'  
Sonra
------------------------------

 select group_id,   
 regexp_replace(  
   listagg(name, ',') within group (order by name)  
   ,'([^,]+)(,\1)+', '\1')  
 from demotable  
 group by group_id;   

 group_id names  
 -------- -----  
 1     'Alan, David, John'  
 2     'Charles, Julie'  

4 Şubat 2016 Perşembe

Linux server tarafına kurulum yapmadan x-windows 'a ulaşmak

Oracle veritabanı linux kurulumlarında konforlu bir ortam sağlaması nedeniyle
grafik ekran kullanmayı tercih ediyorum. Bu konuda server tarafında
vnc server veya nx gibi bir kurulum yapmadan x-windows görüntüsünü almak için
ücretsiz yazılımlar olan putty ve xming ikilisi kolayca kullanılabilir.

Setup dosyası ile xming kurulumunun yapılmasının ardından tek yapmak gereken şey
putty içerisinde x11 forwarding aktivasyonu yapmak. X display location kısmına
"localhost:0.0" yazmayı ve tekrar tekrar uğraşmamak için kaydetmeyi unutmayın.













Download
-----------------
http://sourceforge.net/project/downloading.php?group_id=156984&filename=Xming-6-9-0-31-setup.exe
http://www.chiark.greenend.org.uk/~sgtatham/putty/

Ek Bilgi
-----------------
http://www.geo.mtu.edu/geoschem/docs/putty_install.html

Security - Best Practises (Oracle - Linux vs)

Güvenlik konusunda ücretsiz olarak erişebileceğiniz
best practise dökümanlarına aşağıdaki linkten ulaşabilirsiniz.
(Oracle 11g,Oracle 12c, Mysql, DB2, Linux 6, VmWare, Apache, IIS vs. )

Örnek Döküman
-------------------------
CIS Oracle Database Server 11g R2 Benchmark v2.1.0
Release Date: Mon Nov 30 10:15:44 2015
https://benchmarks.cisecurity.org/downloads/show-single/?file=oracle11gR2.210

This document is intended to address the recommended security settings for Oracle Database 11g R2. This guide was tested against Oracle 11g R2 (11.2.0.4) running on a Windows Server 2012 R2 instance as a stand-alone system, and running on an Oracle Linux 6.5 instance also as a stand-alone system. Future Oracle 11g R2 critical patch updates (CPUs) may impact the recommendations included in this document.

https://benchmarks.cisecurity.org/downloads/browse/index.cfm?category=benchmarks.servers

3 Şubat 2016 Çarşamba

Ön tanımlama gerekmeyen cursor loop

Genellikle cursor loop gerektiğinde aşağıdaki yapıyı kullanıyorum.
Hem kod okunurluğunu arttırıyor hem de daha kolay bir kullanımı var.
 DECLARE  
  BEGIN  
  /* Open up a cursor for loop, also selecting  
  * the "p" function which will write rows to  
  * t2 for every row fetched from t1. */  
  FOR crec IN (SELECT tcol, p(tcol) FROM t1) LOOP  
   -- Break out of the loop immediately  
   EXIT;  
  END LOOP;  
 END;  

Daha fazla bilgi için aşağıdaki adresi inceleyebilirsiniz.
http://psoug.org/reference/control_struct.html

Tek satırdaki ve belirli bir ayıraç ile ayrılmış verinin çok satırlı hale dönüştürülmesi(Connect By)

Aşağıda "," ayracı ile ayrılmış olan "abcd,123,defoifcd,87765" verisi
virgülle ayrılmış her bir veri ayrı bir satır olacak şekilde görüntülenmektedir.
 SQL> with t as (select 'abcd,123,defoifcd,87765' as str from dual)  
 select level as n, regexp_substr(str,'[^,]+',1,level) as val  
 from  t  
 connect by regexp_substr(str,'[^,]+',1,level) is not null ;  
      N VAL  
 ---------- ------------------------------  
      1 abcd  
      2 123  
      3 defoifcd  
      4 87765  
 SQL>  

Birden fazla satır içeren verinin tek satırda gösterilmesi (LISTAGG)

 select  
   deptno,  
   listagg (ename, ',')   
 WITHIN GROUP   
 (ORDER BY ename) enames  
 FROM   
   emp  
 GROUP BY   
   deptno  
 /   


Komut çıktısı aşağıdaki gibi olacaktır.
   DEPTNO ENAMES                        
 ---------- --------------------------------------------------  
     10 CLARK,KING,MILLER                   
     20 ADAMS,FORD,JONES,SCOTT,SMITH          
     30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD    

Belirli bir klasör içerisindeki çok sayıda dosyanın hızlı silinmesi

Aşağıdaki komut içinde bulunan dizin içerisindeki
tüm dosyaları çok hızlı bir şekilde silecektir. (Linux)

perl -e 'for(<*>){((stat)[9]<(unlink))}'

sqlplus ile yapılan işler için log oluşturma

ECHO {OFF|ON} : Çalıştırılmış olan komutu görüntüler. SPOOL : Çıktıyı belitilen dosyaya yazar.
 SQL> set echo on  
 SQL> SPOOL test.log  
 SQL> select 1 from dual;  
      1  
 ----------  
      1  
 SQL>  
Sonra test.log dosyası içine "cat" komutu ile baktığımızda çıktıyı görebiliriz.
 -bash-3.2$ cat test.log  
 SQL> select 1 from dual;  
      1  
 ----------  
      1  
 SQL>  
 SQL>  
 SQL> exit  
 -bash-3.2$  

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/