Sayfalar

Oracle E-Business Suite etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Oracle E-Business Suite etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

24 Ekim 2013 Perşembe

Concurrent oluşturma



Concurrent olusturma procedure'u:
Yazılan procedure un
( ....
errbuf OUT VARCHAR2,
retcode OUT NUMBER
) 
seklinde parametreleri olmak zorundadir.
  • Oracle 'a girilir (Uygulama Yazılımı Geliştiricisi) 
    1- Yürütülür program tanımlanır.
  • Uygulama Yazılımı Geliştiricisi menusunden Eşzamanlı ->Yürütülür menusune girilir.
  • Yürütülebilir dosya adı alanına Concurrent i açıklayan bir yazı yazılır.
  • Kısa Ad alanına özet isim verilebilir (Genelde procedure ismi verilir)
  • Uyg. Yzlm alanına Yeşim Uygulama Geliştirme yazılır
  • Procedure ise PL/SQL Saklanan procedure secilir.
  • Çalıştırma Dosyası Adı alanına yazılan procedure un ismi yazilir. Başına APPS yazmaya gerek yok. Diger semalardan yararlanilacaksa mesela SEVK ise basina SEVK yazılır.
  • Aşama fonksiyon parametreleri alanina girilerek parametreler belirlenir.
  • Kaydet tuşuna basilir.

















  • 2- Program tanımlanır.
  • Uygulama Yazılımı Geliştiricisi menusunden Eşzamanlı ->Programı menusune girilir.
  • Program alanına açıklayızı programın adi yazilir.
  • Kısa Ad alanına özet isim verilir.
  • Uyg yzlm alanına Yeşim Uygulama Geliştirme yazılır
  • Çalıştırılan dosya kısmında Ad alanına procedure ismi yazılır.
  • Yontem alanına PL/SQL Saklanan procedure u yazılır.
  • Kaydet tuşuna basılır.



  • 3- İlgili kisilere yetkiler verilir. Yetki için 
  • Oracle Application System Administrator ile gelen ekrandan;


Security : Responsibility define ile ekran açılır.






Request grup alanından name alınır.

Daha sonra ;


Responsibility Request ile


Oluşturduğumuz concurrent sorumluluk altında tanımlanır ve kaydedilir. Concurrent çalıştırılmaya hazırdır.

  • Concurrent calistirmak icin ise 
  • Gorunum -> Talepler menusunden
    Yeni talep gonder botununa tiklanır.
    Tek talep secilir OK denir
    Adı yazılır (F11 ile arama yapılabilir)
    Başlat denir.






10 Temmuz 2012 Salı

Oracle Mobile Web Applications (MWA)


Oracle Mobile Web Applications (MWA)


Oracle Mobile Web Applications uygulamalarının nasıl yapıldığını anlatmaya çalışacağım.

Öncelikle kullanıcımıza yetki vermemiz gerekiyor.

Burada kullanıcımıza “Depo Yönetimi Mobil Kullanıcısı” yetkisini veriyorum.

Mobile servisi açık değilse
Putty ile giriş yapılıp

cd $INST_TOP/admin/scripts
mwactl.sh start 10550

komutları çalıştırılır.

Servis daha önceden açık ve kapatılmak isteniyorsa

cd $INST_TOP/admin/scripts
mwactl.sh -login apps/apps stop_force 10550

komutları ile kapatılabilir.

Herşeyin hazır olduğunu kontrol etmek için mwagui dizininde (internetten bulunabilir) bulunan startMWA_GUI.bat dosyasını aşağıdakine benzer bir şekilde duzenlemek gerekiyor.

set MWA_GUI_TOP=C:\mwagui_new
set JAVA_TOP="C:\Program Files\Java\jdk1.6.0_32"
%JAVA_TOP%\bin\java -classpath %JAVA_TOP%\lib\classes.zip;%MWA_GUI_TOP%\lib\j9969932_3p.zip;%MWA_GUI_TOP%\lib\j9969932_fnd.zip;%MWA_GUI_TOP%\lib\j9969932_mwa.zip -Dfile.encoding=cp857 -Duser.language=tr_TR oracle.apps.mwa.awt.client.StartGUI

Ardından bu dosyayı calistirdigimizda
Gibi bir ekran çıkacaktır. Burada server bilgilerini ve portu girdikten sonra Connect denirse
Gibi bir ekran gelecektir. Default menusune tıklanarak
Kullanici giriş ekranına gelinir.
Kullanici adi ve şifre girildikten sonra
Menumuz gelir.
Bu menuye bizim hazırladığımız ekranları ekleyebiliriz.
Bunu yapmadan önce kodlarımızı hazırlayalım.
3 farklı dosyamız olacak (Bu dosyalar http://oracle.anilpassi.com/hello-world-mobile-supply-chain-application-framework-6.html adresinden alınmıştır.)
1-      CustomTestFListener.java dosyası
2-      CustomTestFunction.java dosyası
3-      CustomTestPage.java dosyası

Kodlar aşağıdadır.

CustomTestFListener.java dosyası

/* Listener Class - Handles all events */

//package xxx.custom.server;
package xxysm.oracle.apps.inv;

import oracle.apps.inv.utilities.server.UtilFns;
import oracle.apps.mwa.beans.FieldBean;
import oracle.apps.mwa.container.Session;
import oracle.apps.mwa.eventmodel.AbortHandlerException;
import oracle.apps.mwa.eventmodel.DefaultOnlyHandlerException;
import oracle.apps.mwa.eventmodel.InterruptedHandlerException;
import oracle.apps.mwa.eventmodel.MWAEvent;
import oracle.apps.mwa.eventmodel.MWAFieldListener;


public class CustomTestFListener implements MWAFieldListener
{
  public CustomTestFListener()
  {
  }

  public void fieldEntered(MWAEvent mwaevent) throws AbortHandlerException,
                                                     InterruptedHandlerException,
                                                     DefaultOnlyHandlerException
  {
    UtilFns.trace("Inside Field Entered");
    ses = mwaevent.getSession();
    String s = UtilFns.fieldEnterSource(ses);
    // Prints the Current Bean's ID
    UtilFns.trace("CustomFListener:fieldEntered:fldName = " + s);
  }

  public void fieldExited(MWAEvent mwaevent) throws AbortHandlerException,
                                                    InterruptedHandlerException,
                                                    DefaultOnlyHandlerException
  {
    String s = ((FieldBean)mwaevent.getSource()).getName();
    // Prints the Current Bean's ID
    UtilFns.trace("CustomFListener:fieldExited:fldName = " + s);

    // Get handle to session and page
    Session ses = mwaevent.getSession();
    pg = (CustomTestPage)ses.getCurrentPage();

    // when the user clicks the Submit button call the method to print
    // Hello world with the text entered in text box

     if (s.equals("TEST.SUBMIT"))
     {
       pg.print(mwaevent,pg.getHelloWorld());
       return;
      }
  }
  // Varibale declaration
  CustomTestPage pg;
  Session ses;
}


CustomTestFunction.java dosyası:

/* Function class - this links the page with FND Function in AOL */
//package xxx.custom.server;

package xxysm.oracle.apps.inv;

import oracle.apps.fnd.common.VersionInfo;
import oracle.apps.inv.utilities.server.UtilFns;
import oracle.apps.mwa.beans.MenuItemBean;
import oracle.apps.mwa.eventmodel.MWAAppListener;
import oracle.apps.mwa.eventmodel.MWAEvent;

public class CustomTestFunction extends MenuItemBean implements MWAAppListener
{

  public CustomTestFunction()
  {
    //Link the page with the function
    //setFirstPageName("xxx.custom.server.CustomTestPage");
    setFirstPageName("xxysm.oracle.apps.inv.CustomTestPage");
    addListener(this);
  }

  public void appEntered(MWAEvent mwaevent)
  {
    // Code here to initialize Application Level

    // Logging Functions
    UtilFns.trace("Application Entered");
  }

  public void appExited(MWAEvent mwaevent)
  {
    // Code to be executed when the user exits the application

    // Logging Functions
    UtilFns.trace("Application Exited");
  }

  public static final String RCS_ID = "$Header:$";
  public static final boolean RCS_ID_RECORDED =
    VersionInfo.recordClassVersion("$Header:$", "%packageheader%");

}


CustomTestPage.java dosyası:

/* Page Class - Which has the Page Layout. We create and add beans to it */

//package xxx.custom.server;

package xxysm.oracle.apps.inv;

import oracle.apps.fnd.common.VersionInfo;
import oracle.apps.inv.utilities.server.UtilFns;
import oracle.apps.mwa.beans.ButtonFieldBean;
import oracle.apps.mwa.beans.PageBean;
import oracle.apps.mwa.beans.TextFieldBean;
import oracle.apps.mwa.eventmodel.AbortHandlerException;
import oracle.apps.mwa.eventmodel.DefaultOnlyHandlerException;
import oracle.apps.mwa.eventmodel.InterruptedHandlerException;
import oracle.apps.mwa.eventmodel.MWAEvent;

//import xxx.custom.server.CustomTestFListener;
import xxysm.oracle.apps.inv.CustomTestFListener;

//Page Listener Class

public class CustomTestPage extends PageBean
{
  /**
   * Default constructor which just initialises the layout.
   */
  public CustomTestPage()
  {
    //Method to initialize the layout
    initLayout();
  }


  /**
   * Does the initialization of all the fields. Creates new instances
   * and calls the method to set the prompts which may have to be later
   * moved to the page enter event if we were using AK prompts as we
   * require the session for the same.
   */
  private void initLayout()
  {

    //Logging
    if (UtilFns.isTraceOn)
      UtilFns.trace("CustomPage initLayout");

    //Create a Text Filed and Set an ID
    mHelloWorld = new TextFieldBean();
    mHelloWorld.setName("TEST.HELLO");

    // Create a Submit Button and set an ID
    mSubmit = new ButtonFieldBean();
    mSubmit.setName("TEST.SUBMIT");

    //add the fields
    addFieldBean(mHelloWorld);
    addFieldBean(mSubmit);

    //add field listener to all necessary fields
    CustomTestFListener fieldListener = new CustomTestFListener();

    mHelloWorld.addListener(fieldListener);
    mSubmit.addListener(fieldListener);

    //call this method to initializa the prompts
    this.initPrompts();
  }


  /**
   * Method that sets all the prompts up.
   */
  private void initPrompts()
  {

    UtilFns.trace(" Custom Page - Init Prompts");

    // sets the page title
    this.setPrompt("Test Custom Page");

    // set the prompts for all the remaining fields
    mHelloWorld.setPrompt("Enter Your Name");
    mSubmit.setPrompt("Submit");

    //please note that we should not hard code page name and prompts
    //as it may cause translation problems
    //we have an different procedure to overcome this

  }

  // This method is called when the user clicks the submit button

  public void print(MWAEvent mwaevent,
                    TextFieldBean mTextBean) throws AbortHandlerException
  {
    UtilFns.trace(" Custom Page - print ");

    // Get the value from Text bean and append hello world
    // and display it to user on the same field
    String s = mTextBean.getValue();
    mTextBean.setValue(s + " Hello World");
  }

  // Method to get handle of TextBean

  public TextFieldBean getHelloWorld()
  {
    return mHelloWorld;
  }

  //Method called when the page is entered

  public void pageEntered(MWAEvent e) throws AbortHandlerException,
                                             InterruptedHandlerException,
                                             DefaultOnlyHandlerException
  {

    UtilFns.trace(" Custom Page - pageEntered ");

  }

  //Method called when the page is exited

  public void pageExited(MWAEvent e) throws AbortHandlerException,
                                            InterruptedHandlerException,
                                            DefaultOnlyHandlerException
  {
    UtilFns.trace(" Custom Page - pageExited ");
  }

  // Create the Bean Variables
  TextFieldBean mHelloWorld;
  protected ButtonFieldBean mSubmit;

}


Kodları Jdeveloper gibi bir java compiler programı ile açıp derlememiz gerekiyor.





JDeveloperda Make komutu bizim işimize yarayacaktır. Her dosyayı aynı şekilde derledikten sonra oluşan class doyalarını $JAVA_TOP dizininde kendimize ozel olarak tanımladığımız yere atabiliriz(.../xxysm/oracle/apps/inv gibi).

Şimdi hazırladığımız ekranı menuye eklemeye sıra geldi.
Yukarıda da görüldüğü gibi menumuz WMS_MOB_NAVIGATE. Bu menuye ekleme yapabilmemiz icin öncelikle fonksiyonumuzu tanımlamamız gerekiyor.
 Test fonksiyonunu tanımlayarak başlıyorum.
Özellikler tabından
 Mobil İş Yönetim Sistemi Tipi secilir.
Ekran tabını oldugu gibi bırakıyoruz.
Web HTML tabında ise
Class dosyalarımızın dizinindeki function (xxysm.oracle.apps.inv.CustomTestFunction) belirtilir.
Kaydetme işleminden sonra fonksiyonumuz tanımı tamamlanmış olacak.
Menuye fonksiyonumuz eklendikten sonra bu fonksiyon kullanılabilir durumdadır.
Görüldüğü gibi Mobil Test fonksiyonumuz menuye eklenmiş.
Menuye tıkladığımızda bizim ekranımız gelir.
İsmimizi yazıp Submit tuşuna bastığımızda,
Türkçe karakterleri desteklemeyerek sonucu verdiğini görürüz. 


Burada sistemde oluşan hataları bulabilmemiz için $INST_TOP/admin/install /mwa.cfg dosyasındaki
mwa.LogLevel = trace
Değerini yukarıdaki gibi değiştiriyoruz...

cd $INST_TOP/logs ile giriş yapılıp
tail –f  10550.system.log
ile log kontrolu yapılır...

Türkçe karakter çözümü için ise
linkindeki aşağıdaki çözümü uygulayabilirsiniz.

NLS Support

Here are some tips for implementing the mobile GUI with Multi-language (MLS/NLS). Some customers had issues with character encoding (for example Turkish characters). Here are steps followed to fix the issue:
1:- Download and apply server side Patch 11853398
2:- Set the "ICX: Language" profile at USER level to <REQUIRED LANGUAGE> for a Mobile user.
3:- Shutdown the MWA servers
4:- Download MWA GUI multilingual GUI Patch 12574324
5:- Create client folder and extract the files from the zip
unzip p12574324_11i_WINNT.zip C:\NLSMWAGUI_12574324

cd C:\NLSMWAGUI_12574324

cp 12574324_mwa.zip C:\NLSMWAGUI_12574324\lib
cp 12574324_3p.zip C:\NLSMWAGUI_12574324\lib
cp j12574324_ak.zip C:\NLSMWAGUI_12574324\lib
cp j12574324_fnd.zip C:\NLSMWAGUI_12574324\lib

6:- Create a cmd file to start the client
set MWA_GUI_TOP=C:\NLSMWAGUI_12574324
set JAVA_TOP=C:\Progra~1\Java\jre6
%JAVA_TOP%\bin\java -Dfile.encoding=UTF8 -Duser.language=TR -classpath %JAVA_TOP%\lib\classes.zip;%MWA_GUI_TOP%\j12574324_mwa.zip;%MWA_GUI_TOP%\j12574324_3p.zip;%MWA_GUI_TOP%\j12574324_ak.zip;%MWA_GUI_TOP%\j12574324_fnd.zip oracle.apps.mwa.awt.client.StartGUI













9 Temmuz 2012 Pazartesi

Custom Java kodlarının oracle formslara entegre edilmesi

Merhaba;

Oracle Forms'ta yazabilecekleriniz yeterli olmadığı durumlarda Java kodlarından destek almamız kaçınılmaz oluyor. Bu java kodlarının oturum açılırken (forms ekranı) client tarafa indirilmesi ve client ortamında çalıştırılması isteniyorsa kodun sisteme atılması ve bazı dosyalarda değişiklik yapılması gerekmektedir.

Aşağıda custom yazılan java kodlarının sisteme entegre edilmesinin aşamalarını anlatmaya çalışacağım.

  1. Oluşturulan java dosyaların class ları $OA_JAVA path in altına kopyalanır.
  2. $FND_TOP/java/make tabındaki fndjar.dep dosyasına jar ismi ile içereceği class dosyaları tanımlanır.     Örneğin :

        PortManage.jar :
        oracle/forms/fd/mypackage/TwoWaySerialComm$SerialReader
        oracle/forms/fd/mypackage/TwoWaySerialComm$SerialWriter
        oracle/forms/fd/mypackage/TwoWaySerialComm
      satırlarını ekleyerek PortManage.jar dosyasının içeriğini belirleyebiliyorsunuz.(Meraklılarına: TwoWaySerialComm.java dosyasını internette bulabilirsiniz)


   3. Tanımlanan jar file ların $OA_JAVA/oracle/apps/fnd/jar path inde oluşması için adadmin den generate product jar files işlemi yapılır.


Consolda adadmin diyerek giriş yapılır.


Default directory yeri belirlenir genelde önerilen yer doğrudur. Yes deyip geçeriz.

Yaptığınız işlemlerin logunun hangi dosyaya aktarılmasını istiyorsak onun adını yazarız.

Hata olması durumda size mail ile bildirilmesini aktif edebilirsiniz. No diyoruz.

Batchsize belirlenir. Default neyse onu verdim.

Database'i soruyor Yes deyip geçiyorum
Schema şifresi giriliyor.
APPS şifresi girilir.


JAR dosyalarinin oluşması için Menuden 1 (Generate Applications Files menu) seçilir.

Sonra çıkan menuden 4 (Generate product JAR files) seçilir.

Tüm JAR dosyalarını yeniden oluşturmasını istemediğimizden No dedik.

Bu işlem sonrasında $OA_JAVA/oracle/apps/fnd/jar dizini altına yeni tanımlanan jar ların oluşup oluşmadığı kontrol edilir.


Eğer oluşmuş ise JAVA_BEAN yapısını kullanarak formlara entegre edilebilir.




7 Ağustos 2011 Pazar

Oracle EBS de Trace Kullanımı

Oracle EBS ekranında
Yardım->Tanı->İzle -> 

Menusunde ilgili tip secilir...
Apps şifresi istenir girdikten sonra...

size bu trace in takibinin yapıldığı dosyanın numarası ve dizini veriyor...

Artık yaptığımız her işlem kaydedilmeye başlanmıştır...

Hata aldığımız veya takip etmek istediğimiz işlemlere devam edilir...

İşlem bitince aynı menuden izleme yok denir ve takip sona erdirilir...

Dosya sistemden bulunup incelenir...

Concurrent ler içinde trace alinabilir... Concrrent tanımı yapılırken İzlemeyi Etkinleştir denip kaydedildikten sonra trace alinabilir...

Session bazında da ayar yapılabilir...

ALTER SESSION SET SQL_TRACE = TRUE
ALTER SESSION SET OPTIMIZER_MODE = ALL_ROWS

ayarları yapılmalıdır...

Trace Dosyasini Çözmek:

TKPROF ile okunabilir hale getirilir...

/Clon2/CLON2/clondb/10.2.0/admin/CLON2_oratestdb/udump
Buradaki trace file ı tkprof komutu ile okunabilir hale getirmemiz lazım
# oracle user ile login olunup
# tkprof trace_file_name

dendikten sonra size trace_file_name dosyası yapılan işlemler hakkında bilgi verecektir...

23 Temmuz 2011 Cumartesi

Programmer Blog: oracle flashback query

Alıntıdır :
Programmer Blog: oracle flashback query: "son zamanlarda sıkça hata yapmaya başladım.yaşlandım herhalde bu işler için. bi delete veya bi update yapıyorum sonra commit diyorum ardında..."


oracle flashback query

son zamanlarda sıkça hata yapmaya başladım.yaşlandım herhalde bu işler için. bi delete veya bi update yapıyorum sonra commit diyorum ardından eyvah diyorum:) sonra da hemen neydi lan bişi vardı tablonun eski tarihli bir görüntüsünü alabiliyorduk diyorum.google a oracel flashback query yazıyorum sonra scn(system change number) li sonuçlar dönüyor falan. ben bilmiyorum scn falan diyorum bana zamanla ilgili bişiler ver bu sefer timestamp çıkıyor karşıma... sonuçta aşağıdaki query i yazabiliyorum.


SELECT *
FROM stn_ihale_yaklasik_maliyet
AS OF SCN TIMESTAMP_TO_SCN(SYSTIMESTAMP - 1/24)


query den de anlaşılacağı üzere arkadaş bize tablonun bir saat önceki veri kümesini veriyor.


burda dikkat edilmesi gereken üç konu var.
1- bu özelliği kullanabilmek için database'de ayarlamak yapmak gerekebilir.(default olarak açıktır karıştırmayın yani:) 10g ile birlikte gelmiştir diye biliyorum)
2- tablo yapısı değişmemiş olmalıdır.yani siz kolon ekler veya çıkarırsanız geçmiş olsun.
3- from yanına sadece tek tablo yazabiliyorsunuz. tavsiyem select in başına
create table tmp as
yazıp sonra gerekli işlemleri yapmanızdır.


birde en fazla bir hafta geriye dönebiliyorsunuz default ayarlarla.


detaylı bilgi için
http://psoug.org/reference/flash_query.html
http://www.oracle-base.com/articles/10g/Flashback10g.php

Alıntı dışı :

SELECT *
  FROM XXYSM.MERICSTOK 
  AS OF SCN TIMESTAMP_TO_SCN (SYSTIMESTAMP - (1-(1439/1440)))
  -- tablonun 1 dk onceki halini verir
  -- 1440 - dk değeri 1439 yerine yazılmalıdır...


5 dk onceki halini istiyorsak

SELECT *
  FROM XXYSM.MERICSTOK 
  AS OF SCN TIMESTAMP_TO_SCN (SYSTIMESTAMP - (1-(1435/1440)))
 

yazılmalıdır...

29 Haziran 2011 Çarşamba

PL/SQL de satırdan sutuna , sutundan satıra çevirme, crosstab , row to column , column to row

SELECT u.user_name
  FROM fnd_user u
 WHERE u.creation_date > SYSDATE – 120

Şeklinde yazılan sorguda sonuç

Ahmet
Mehmet
Veli
…

Olsun. Amacımız oluşan bu listeyi tek satirda araya bizim belirleyeceğimiz bir ayraç ile birleştirerek

Ahmet,Mehmet,Veli, ….

gibi getirmek ise şu yöntemi uygulayabiliriz…


Öncelikle liste için bir tip belirleriz…

CREATE TYPE TListe IS TABLE OF VARCHAR2 (4000);

Bir de bu listeyi belirleyeceğimiz ayraç ile birleştiren fonksiyonu oluştururuz…

CREATE FUNCTION apps.birlestir (p_liste IN tliste, p_separator IN VARCHAR2)
   RETURN VARCHAR2 IS
   ret   VARCHAR2 (4000);
BEGIN
   FOR j IN 1 .. p_liste.LAST LOOP
      IF j = 1 THEN
         ret := p_liste (j);
      ELSE
         ret := ret || p_separator || p_liste (j);
      END IF;
   END LOOP;

   RETURN ret;
EXCEPTION
   WHEN OTHERS THEN
      RETURN NULL;
END;

Şimdi sorgumuza geçebiliriz…

SELECT apps.birlestir (CAST (MULTISET (SELECT u.user_name
                                         FROM fnd_user u
                                        WHERE u.creation_date > SYSDATE - 120) AS apps.tliste),
                       ',')
          isimler
FROM DUAL;




Sonuç :

isimler
Ahmet,Mehmet,Veli,…

Olur…

Satirdan sutuna geçirmenin diger bir yöntemi de

SELECT TRUNC (f.creation_date) tarih, RTRIM (XMLAGG (XMLELEMENT (e, f.user_name || '-' || f.user_id || ',')).EXTRACT ('//text()'), ',') isimler
  FROM fnd_user f
GROUP BY TRUNC (creation_date);

Tarih              isimler
01.01.2011    Ahmet-1,Mehmet-2
01.02.2011    Veli-3, Mustafa-4

Gibi sonuclar olacaktir…



Ayraç ile birleştirilmiş bir alandan istenen parçaların getirilmesinin sağlanmasi

Örneğin;

Ne 30/1 - 12630037%76|100/36 den - 101721%24

Yukaridaki alanda ayraç “|” olarak belirlenmiş..
Biz bu ayraca gore
Ne 30/1 - 12630037%76
Ve
100/36 den - 101721%24
Değerlerinin alınmasını istersek su fonksiyonu yazabiliriz…


CREATE OR REPLACE FUNCTION APPS.explode (
   p_seperator   IN   VARCHAR2,
   p_string      IN   VARCHAR2,
   p_count            NUMBER
)
   RETURN VARCHAR2
AS
   l_string   LONG           DEFAULT p_string || p_seperator;
   TYPE listtable is TABLE OF VARCHAR2 (255);
   l_data     listtable      := listtable ();
   n          NUMBER;
   RESULT     VARCHAR2 (255);
BEGIN
   LOOP
      EXIT WHEN l_string IS NULL;
      n := INSTR (l_string, p_seperator);
      l_data.EXTEND;
      l_data (l_data.COUNT) := LTRIM (RTRIM (SUBSTR (l_string, 1, n - 1)));
      l_string := SUBSTR (l_string, n + 1);
   END LOOP;

   RESULT := l_data (p_count);
   RETURN RESULT;
EXCEPTION
   WHEN OTHERS
   THEN
      RETURN RESULT;
END;


SELECT 'Ne 30/1 - 12630037%76|100/36 den - 101721%24' orj, explode ('|', 'Ne 30/1 - 12630037%76|100/36 den - 101721%24', 1) ilk, explode ('|', 'Ne 30/1 - 12630037%76|100/36 den - 101721%24', 2) ikinci
  FROM DUAL;

Çıktı :

Orj                                                                                              ilk                                                                       ikinci
Ne 30/1 - 12630037%76|100/36 den - 101721%24              Ne 30/1 - 12630037%76 100/36 den - 101721%24

Bu örneği bir üst level a alirsak…
Ayraç ile ayırmanın en fazla 8 adet olabileceğini bilerek eklenen herbir değeri satir satir göstermek isteyelim…

SELECT ROWNUM, explode ('|', 'TEKSTURE - 3R28884%7,31|TEKSTURE - 010015504KREM01%25,27|TEKSTURE - 010007255BEJ01%4,65|TEKSTURE - 3R28978%16,46|TEKSTURE - 3R28978%4,3|TEKSTURE - 3R2', 1) ilk, explode ('|', 'TEKSTURE - 3R28884%7,31|TEKSTURE - 010015504KREM01%25,27|TEKSTURE - 010007255BEJ01%4,65|TEKSTURE - 3R28978%16,46|TEKSTURE - 3R28978%4,3|TEKSTURE - 3R2', 2) iki,
               explode ('|', 'TEKSTURE - 3R28884%7,31|TEKSTURE - 010015504KREM01%25,27|TEKSTURE - 010007255BEJ01%4,65|TEKSTURE - 3R28978%16,46|TEKSTURE - 3R28978%4,3|TEKSTURE - 3R2', 3) uc, explode ('|', 'TEKSTURE - 3R28884%7,31|TEKSTURE - 010015504KREM01%25,27|TEKSTURE - 010007255BEJ01%4,65|TEKSTURE - 3R28978%16,46|TEKSTURE - 3R28978%4,3|TEKSTURE - 3R2', 4) dort, explode ('|', 'TEKSTURE - 3R28884%7,31|TEKSTURE - 010015504KREM01%25,27|TEKSTURE - 010007255BEJ01%4,65|TEKSTURE - 3R28978%16,46|TEKSTURE - 3R28978%4,3|TEKSTURE - 3R2', 5) bes,
               explode ('|', 'TEKSTURE - 3R28884%7,31|TEKSTURE - 010015504KREM01%25,27|TEKSTURE - 010007255BEJ01%4,65|TEKSTURE - 3R28978%16,46|TEKSTURE - 3R28978%4,3|TEKSTURE - 3R2', 6) alti, explode ('|', 'TEKSTURE - 3R28884%7,31|TEKSTURE - 010015504KREM01%25,27|TEKSTURE - 010007255BEJ01%4,65|TEKSTURE - 3R28978%16,46|TEKSTURE - 3R28978%4,3|TEKSTURE - 3R2', 7) yedi, explode ('|', 'TEKSTURE - 3R28884%7,31|TEKSTURE - 010015504KREM01%25,27|TEKSTURE - 010007255BEJ01%4,65|TEKSTURE - 3R28978%16,46|TEKSTURE - 3R28978%4,3|TEKSTURE - 3R2', 8) sekiz
          FROM dual k
Bu sorgu ile tek satıra düşüyoruz…

SELECT ROWNUM,CASE
          WHEN ROWNUM = 1 THEN ilk
          WHEN ROWNUM = 2 THEN iki
          WHEN ROWNUM = 3 THEN uc
          WHEN ROWNUM = 4 THEN dort
          WHEN ROWNUM = 5 THEN bes
          WHEN ROWNUM = 6 THEN alti
          WHEN ROWNUM = 7 THEN yedi
          WHEN ROWNUM = 8 THEN sekiz
       END bilgi
  FROM (SELECT ROWNUM, explode ('|', 'TEKSTURE - 3R28884%7,31|TEKSTURE - 010015504KREM01%25,27|TEKSTURE - 010007255BEJ01%4,65|TEKSTURE - 3R28978%16,46|TEKSTURE - 3R28978%4,3|TEKSTURE - 3R2', 1) ilk, explode ('|', 'TEKSTURE - 3R28884%7,31|TEKSTURE - 010015504KREM01%25,27|TEKSTURE - 010007255BEJ01%4,65|TEKSTURE - 3R28978%16,46|TEKSTURE - 3R28978%4,3|TEKSTURE - 3R2', 2) iki,
               explode ('|', 'TEKSTURE - 3R28884%7,31|TEKSTURE - 010015504KREM01%25,27|TEKSTURE - 010007255BEJ01%4,65|TEKSTURE - 3R28978%16,46|TEKSTURE - 3R28978%4,3|TEKSTURE - 3R2', 3) uc, explode ('|', 'TEKSTURE - 3R28884%7,31|TEKSTURE - 010015504KREM01%25,27|TEKSTURE - 010007255BEJ01%4,65|TEKSTURE - 3R28978%16,46|TEKSTURE - 3R28978%4,3|TEKSTURE - 3R2', 4) dort, explode ('|', 'TEKSTURE - 3R28884%7,31|TEKSTURE - 010015504KREM01%25,27|TEKSTURE - 010007255BEJ01%4,65|TEKSTURE - 3R28978%16,46|TEKSTURE - 3R28978%4,3|TEKSTURE - 3R2', 5) bes,
               explode ('|', 'TEKSTURE - 3R28884%7,31|TEKSTURE - 010015504KREM01%25,27|TEKSTURE - 010007255BEJ01%4,65|TEKSTURE - 3R28978%16,46|TEKSTURE - 3R28978%4,3|TEKSTURE - 3R2', 6) alti, explode ('|', 'TEKSTURE - 3R28884%7,31|TEKSTURE - 010015504KREM01%25,27|TEKSTURE - 010007255BEJ01%4,65|TEKSTURE - 3R28978%16,46|TEKSTURE - 3R28978%4,3|TEKSTURE - 3R2', 7) yedi, explode ('|', 'TEKSTURE - 3R28884%7,31|TEKSTURE - 010015504KREM01%25,27|TEKSTURE - 010007255BEJ01%4,65|TEKSTURE - 3R28978%16,46|TEKSTURE - 3R28978%4,3|TEKSTURE - 3R2', 8) sekiz
          FROM dual k)
CONNECT BY LEVEL <= 8


Çıktı:
1              TEKSTURE - 3R28884%7,31
2              TEKSTURE - 010015504KREM01%25,27
3              TEKSTURE - 010007255BEJ01%4,65
4              TEKSTURE - 3R28978%16,46
5              TEKSTURE - 3R28978%4,3
6              TEKSTURE - 3R2
7             
8             

Şeklinde olur…


Procedure ise 

CREATE FUNCTION APPS.explode (

   p_seperator   IN   VARCHAR2,
   p_string      IN   VARCHAR2,
   p_count            NUMBER
)
   RETURN VARCHAR2
AS
   l_string   LONG           DEFAULT p_string || p_seperator;
   TYPE listtable is TABLE OF VARCHAR2 (255);
   l_data     listtable      := listtable ();
   n          NUMBER;
   RESULT     VARCHAR2 (255);
BEGIN
   LOOP
      EXIT WHEN l_string IS NULL;
      n := INSTR (l_string, p_seperator);
      l_data.EXTEND;
      l_data (l_data.COUNT) := LTRIM (RTRIM (SUBSTR (l_string, 1, n - 1)));
      l_string := SUBSTR (l_string, n + 1);
   END LOOP;

   RESULT := l_data (p_count);
   RETURN RESULT;
EXCEPTION
   WHEN OTHERS
   THEN
      RETURN RESULT;
END;










Random veriye ihtiyaç duyulursa

SELECT     rownum,TRUNC (DBMS_RANDOM.VALUE (1, 100)) a,
           DBMS_RANDOM.STRING ('U', 20) b, DBMS_RANDOM.STRING ('L', 20) c,
           DBMS_RANDOM.STRING ('A', 20) d, DBMS_RANDOM.STRING ('P', 20) e,
           DBMS_RANDOM.VALUE (1, 100) f, DBMS_RANDOM.VALUE g,
           DBMS_RANDOM.random h
      FROM DUAL
CONNECT BY LEVEL <= 7

U - Upper case
L - Lower case
A - Alphanumeric
X - Alphanumeric with upper case alphabets.
P - Printable characters only.

--------



SELECT DISTINCT k.ad, wm_concat (DISTINCT k.soyad) soyadlar, COUNT (DISTINCT k.soyad)
  FROM sevk.kullanici k
GROUP BY k.ad
ORDER BY COUNT (DISTINCT k.soyad) DESC


wm_concat kullanarakta yukarıdaki gibi bir sorgu çalıştırılabilir...