在EBS的作業流程中,與外部系統做資料交換時,若產生資料檔及控制檔後,並放至Server上的資料交換目錄,此時可用Concurrent Program排程去取得資料交換的資訊,並做相關的處理。

  為達成此目的,程式設計時有許多的方式來處理,不管是使用單純java或是其它的程式功能,都應可達成此需求。 而在此想跟大家分享的部份,是透過DB 的角度,使用Java Stored Procedure及PLSQL來達成此需求。希望,對大家在程式設計時,能有多個選擇。

其步驟如下:

  1. 首先,先在Server上建立一個新的目錄(:/demo),放置檔案到此目錄下。 然後,使用System的帳號,來Grant讀取權限給此目錄。

                                 dbms_java.grant_permission('APPS','SYS:java.io.FilePermission','/demo','read');

                               2. 登入到APPS帳號,再建立String Type來處理String array 

         create or replace type myTableType as table of varchar2(4000);

  3. 建立新的function來轉換逗號分隔字串變成字串陣列    

        create or replace function str2tbl(p_str in varchar2) return myTableType as
           l_str  long default p_str;
           l_n    varchar2(4000);
           l_data myTableType := myTabletype();
        begin
          loop
               l_n := instr(l_str, ',');
              exit when(nvl(l_n, 0) = 0);
              l_data.extend;
              l_data(l_data.count) := ltrim(rtrim(substr(l_str, 1, l_n - 1)));
              l_str := substr(l_str, l_n + 1);
          end loop;
          return l_data;
        end;

       4. 建立下列的Java stored procedure來取得目錄的列表

      create and compile java source named "getdirlisting"

      as
           import java.io.*;
           import java.util.*;
           import java.util.zip.*;
           import java.text.*;
           import java.lang.*;
       class getdirlisting
         {
                public static String getlisting(String dirname) throws Exception
                 {
                 String retval=null;
                 File dir = new File(dirname);
                 String[] files = dir.list();
                 if (files!=null)
                   {
                      for (int i=0;i<files.length;i++)
                       {
                        retval = retval + files[i] + ",";
                      }
                  }
                 return retval;
                }
         }

      5. 接下來將PL/SQL封裝所需的 Java  Store  Procedure
         (function: getfilesindir)        

          create or replace function getfilesindir(p_long_path_dir_name varchar2)
              return varchar2
              as language java name 'getdirlisting.getlisting(java.lang.String) return java.lang.String';

      6. 完成上述的Java Store Procedure及PL/SQL function之後,可以自行建立Procedure,使用DBMS_OUTPUT來列出檔案資訊。

         create or replace procedure processDir(dirname varchar2) as

               filelist myTableType;
         begin
               filelist := str2tbl(getfilesindir(dirname));
               for i in filelist.first .. filelist.last LOOP
                  -- process here
                  dbms_output.put_line('processing file: ' || filelist(i));
              end loop;
         end;

      7.用PL/SQL測試列出OS上目錄的檔案內容。參數為目錄的路徑,執行成功後就會列出Demo 目錄下的檔案內容。

         exec  processDir('/demo');

       8.列表結果:    

          processing file: SSS.log

          processing file: Bbb.log

          processing file: ccc.log

     9.測試結束

arrow
arrow
    全站熱搜

    alad 發表在 痞客邦 留言(0) 人氣()