业务背景
在我之前发表的一篇文章《Oracle EBS使用CSV导入Oracle Form及BOM清单导入 API》提到上传导入数据的文件,同时也可以用于文件上传和下载。
Oracle EBS标准上传和下载
上传代码:
/**上传文件
返回值: 上传文件的标识:FND_LOBS.FILE_ID
*/
Function UploadFile Return Number Is
l_AccessId Number;
l_ServerUrl Varchar2(20000);
l_Url Varchar2(20000);
l_ButtonChoice Number;
l_FileId Number;
l_OracleCharset Varchar2(30);
Begin
--Get Process ID
l_AccessId := Fnd_Gfm.authorize(Null);
--Get Web Page
Fnd_Profile.Get('APPS_WEB_AGENT', l_ServerUrl);
l_Url := Rtrim(l_ServerUrl, '/') ||
'/fnd_file_upload.displayGFMform?access_id=' ||
To_Char(l_AccessId) || Chr(38) || 'l_server_url=' || l_ServerUrl;
If (l_Url Is Null) Then
Fnd_Message.Set_String('调用Url失败!');
Fnd_Message.Show;
Raise Form_Trigger_Failure;
End If;
--Open Web Page
Fnd_Utilities.Open_Url(l_Url);
Fnd_Message.Set_String('请选择在打开网页导入的文件,单击“是”按钮上传完毕! ');
l_ButtonChoice := Fnd_Message.Question(button1 => 'Yes',
button2 => null,
button3 => 'No',
default_btn => 1,
cancel_btn => 3,
icon => 'Question');
--Get File ID
l_FileId := Fnd_Gfm.Get_File_ID(l_AccessId);
--获得客户端字符集
If l_FileId Is Not Null And l_FileId <> 0 Then
Select oracle_charset
Into l_OracleCharset
From FND_LOBS
Where FILE_ID = l_FileId;
:Parameter.CLIENTCHARSET := Substr(:Parameter.CLIENTCHARSET,
1,
Instr(:Parameter.CLIENTCHARSET, '.')) ||
l_OracleCharset;
End If;
--取消上传将要删除上传文件的记录
If (l_ButtonChoice = 3) Then
Begin
Delete From FND_LOBS Where FILE_ID = l_FileId;
Exception
When No_Data_Found Then
Null;
End;
l_FileId := 0;
Forms_Ddl('commit');
End If;
Return l_FileId;
End;
其实,调用Oracle EBS标准API上传文件,被上传的文件保存在FND_LOBS表字段FILE_DATA中。
下载代码
参考代码如下:
DECLARE
l_FileId Number;
l_DownloadUrl Varchar2(2000);
BEGIN
--文件标识,来源于FND_LOBS.FILE_ID
l_FileId := :CONTROL.FILE_ID;
--获得下载URL
l_DownloadUrl := fnd_gfm.construct_download_url(fnd_web_config.gfm_agent,
l_FileId,
TRUE);
--下载文件
fnd_utilities.open_url(l_DownloadUrl);
END;
默认下载保存的文件名为:fnd_gfm.zip,需要自己行修改文件名称和文件类型。
优缺点:
优点:
调用Oracle EBS标准功能编写代码工作量小,简单快捷。比较合适处理批量数据导入。
缺点:
1.由于文件存放在Oracle EBS标准FND_LOBS表中,不合适上传数量多和单个大文件,比如:物料图片和技术图纸。
下载文件名称统一默认为fnd_gfm.zip,不便用户使用。