在EBS的作業流程中,與外部系統做資料交換時,若產生資料檔及控制檔後,並放至Server上的資料交換目錄,此時可用Concurrent Program排程去取得資料交換的資訊,並做相關的處理。
為達成此目的,程式設計時有許多的方式來處理,不管是使用單純java或是其它的程式功能,都應可達成此需求。 而在此想跟大家分享的部份,是透過DB 的角度,使用Java Stored Procedure及PLSQL來達成此需求。希望,對大家在程式設計時,能有多個選擇。
其步驟如下:
- 首先,先在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.測試結束