使用CSV导入Oracle Form.docx
- 文档编号:12810885
- 上传时间:2023-06-08
- 格式:DOCX
- 页数:17
- 大小:294.26KB
使用CSV导入Oracle Form.docx
《使用CSV导入Oracle Form.docx》由会员分享,可在线阅读,更多相关《使用CSV导入Oracle Form.docx(17页珍藏版)》请在冰点文库上搜索。
使用CSV导入OracleForm
使用CSV、TSV或TXT檔案上傳至FORM方法:
我想在從事OracleEBS客製的各位應該多少都有碰到User提出是否可以用EXCEL匯入資料。
當然除了OracleWebADI功能外,另外就是使用下述方法搭配標準檔案上傳到Server在讀取組成二維陣列資料,塞到對應的畫面欄位。
因此我在網路上找到了一些資料,稍作修改做了一個共用程式給各位參考!
!
一、步驟:
1.先將FILE_UPLOAD、LOAD_FILE與CLEAR_FND_LOB建立至FORM的程式單元中。
<備註一>
2.新增按鈕觸發執行。
執行內容範例如下:
3.新增參數:
FLE_FILE_NAME、FLE_GFM_ID紀錄上傳檔案ID與名稱。
4.即可執行將檔案上傳至FORM。
(1)按下執行按鈕則會跳出網頁視窗選取欲上傳之檔案。
(2)選好上傳檔案後點選Submit上傳,則會顯示是否成功。
(3)成功後關閉網頁。
點選確認已上傳則開始將檔案複製到FORM中。
(4)導入過程中,在畫面左下角會顯示導入內容且畫面也會持續更新內容。
(5)完全執行完畢後會顯示導入筆數。
二、注意事項:
1.上傳檔案只能是.TXT或.CSV或.TSV且編碼必須為UTF8或ZHT16BIG5否則會失敗。
2.檔案抬頭欄位必須保留且名稱必須與複製BLOCK.ITEM名稱相同。
(若欲不同則需修改LOAD_FILE判斷抬頭名稱是否與設定欄位相同)
3.每一列資料皆要設定欄位區隔與換行符號。
如下圖欄位區隔為Tab換行區隔為;(可自訂但決定後不可改變)
4.注意若有”上引號時,用EXCEL另存CSV或TSV或TXT檔案時判斷會有問題。
需先將”改為其他符號另存新檔後在取替代回”。
5.此公用程式只判斷欄位抬頭欄位名稱是否與設定相同未判斷各欄位資料內容是否符合格式做卡關。
若需要可自行在LOAD_FILE中自行加入。
可在下圖copy前加入卡關!
!
6.在導入之BLOCKTrigger(ON-ERROR)或關閉FORM時,最好再次呼叫CLEAR_FND_LOB以確保上傳檔案確實刪除避免無用檔案上傳造成伺服器負擔。
<備註二>
<備註一>共用程式FILE_UPLOAD、LOAD_FILE與CLEAR_FND_LOB如下:
PROCEDURELOAD_FILE(V_BLOCKVARCHAR2
V_FIELDVARCHAR2
V_COL_SEPARATEVARCHAR2
V_ROW_SEPARATEVARCHAR2
)IS
FLE_GFM_IDNUMBER;
V_FILEVARCHAR2(1000);
V_ROW_SEPVARCHAR2(10);
V_COL_SEPVARCHAR2(10);
V_COMMA_EXISTBOOLEAN:
=FALSE;
MY_FIELDDBMS_UTILITY.UNCL_ARRAY;
MY_FIELD_CNTBINARY_INTEGER;
MY_FIELD_LOCBINARY_INTEGER:
=1;
INUMBER;
FILE_LENNUMBER;
FILE_LOCNUMBER;--Filelocation
TEMP_DATAVARCHAR2(10000);
TEMP_TABVARCHAR2(10000);
ENTER_LOCNUMBER;--ENTER_KEYlocationontempbuffer
TAB_LOCNUMBER;--TAB_KEYlocationontempbuffer
TAB_LOC_OLDNUMBER;--TAB_KEYlocationontempbuffer
COUNTERNUMBER:
=0;
CONTROL_LANGUAGENUMBER;
V_PERIODVARCHAR2(20);
V_DATEDATE;
V_DATE_NAMEVARCHAR2(20);
V_MESG_LEVELVARCHAR2(10);
BEGIN
--用,號分開欄位ex:
'XYZ'To'X,Y,Z'
DBMS_UTILITY.COMMA_TO_TABLE(V_FIELD,MY_FIELD_CNT,MY_FIELD);
--檢查設定欄位是否存在
FORIIN1..MY_FIELD_CNTLOOP
MY_FIELD(I):
=LTRIM(RTRIM(MY_FIELD(I)));
DECLARE
ITEM_IDITEM;
BEGIN
ITEM_ID:
=FIND_ITEM(V_BLOCK||'.'||MY_FIELD(I));
IFID_NULL(ITEM_ID)THEN
FND_MESSAGE.DEBUG('欄位:
'||V_BLOCK||'.'||MY_FIELD(I)||'不存在!
!
');
CLEAR_FND_LOB;--發現設定欄位不合則刪除上傳檔案
RAISEFORM_TRIGGER_FAILURE;
ENDIF;
END;
ENDLOOP;
--FND_MESSAGE.DEBUG('欄位個數:
'||MY_FIELD_CNT);
--判斷欄位區隔符號
IFUPPER(V_COL_SEPARATE)=''THEN
V_COL_SEP:
=CHR(09);
ELSIFUPPER(V_COL_SEPARATE)<>'NULL'THEN
V_COL_SEP:
=V_COL_SEPARATE;
ELSE
V_COL_SEP:
=CHR(0);
ENDIF;
--FND_MESSAGE.DEBUG('V_COL_SEPARATE:
'||V_COL_SEPARATE);
--判斷行數區隔符號
IFUPPER(V_ROW_SEPARATE)=''THEN
V_ROW_SEP:
=CHR(13);
ELSIFUPPER(V_ROW_SEPARATE)<>'NULL'THEN
V_ROW_SEP:
=V_ROW_SEPARATE;
ELSE
V_ROW_SEP:
=CHR(0);
ENDIF;
--FND_MESSAGE.DEBUG('V_ROW_SEPARATE:
'||V_ROW_SEPARATE);
--開啟檔案
FLE_GFM_ID:
=:
PARAMETER.FLE_GFM_ID;
--FND_MESSAGE.DEBUG('FILE_ID:
'||FLE_GFM_ID);
IFFLE_GFM_ID>0THEN
--Getfilelength
SELECTDBMS_LOB.GETLENGTH(FILE_DATA)
INTOFILE_LEN
FROMFND_LOBS
WHERE0=0
ANDFILE_ID=FLE_GFM_ID;
--FND_MESSAGE.DEBUG('資料讀取名稱:
'||FILE_LEN);
GO_BLOCK(V_BLOCK);
CLEAR_BLOCK(NO_VALIDATE);--視需要可不清除
--Selectdata
FILE_LOC:
=1;
ENTER_LOC:
=1;
LOOP
--Findenterkeylocation
SELECTDBMS_LOB.INSTR(FILE_DATA
UTL_RAW.CAST_TO_RAW(V_ROW_SEP)
FILE_LOC
1
)
INTOENTER_LOC
FROMFND_LOBS
WHERE0=0
ANDFILE_ID=FLE_GFM_ID;
--FND_MESSAGE.DEBUG('ENTER_LOC:
'||ENTER_LOC);
BEGIN
SELECTDECODE(LANGUAGE,'US',1,2)
INTOCONTROL_LANGUAGE
FROMFND_LOBS
WHERE0=0
ANDFILE_ID=FLE_GFM_ID;
EXCEPTION
WHENNO_DATA_FOUNDTHEN
CONTROL_LANGUAGE:
=2;
END;
--FND_MESSAGE.DEBUG('CONTROL_LANGUAGE:
'||CONTROL_LANGUAGE);
IFENTER_LOC>0THEN
IFCONTROL_LANGUAGE=1THEN
SELECTUTL_RAW.CONVERT(DBMS_LOB.SUBSTR(FILE_DATA,ENTER_LOC-FILE_LOC,FILE_LOC)
'AMERICAN_AMERICA.UTF8'
'AMERICAN_AMERICA.ZHT16BIG5'
)
INTOTEMP_DATA
FROMFND_LOBS
WHERE0=0
ANDFILE_ID=FLE_GFM_ID;
--FND_MESSAGE.DEBUG('TEMP_DATA:
'||TEMP_DATA);
ELSE
SELECTDBMS_LOB.SUBSTR(FILE_DATA,ENTER_LOC-FILE_LOC,FILE_LOC)
INTOTEMP_DATA
FROMFND_LOBS
WHERE0=0
ANDFILE_ID=FLE_GFM_ID;
ENDIF;
--TEMP_DATA:
=LTRIM(RTRIM(UTL_RAW.CAST_TO_VARCHAR2(TEMP_DATA)));
FILE_LOC:
=ENTER_LOC+2;
ENTER_LOC:
=ENTER_LOC+2;
ELSE
IFCONTROL_LANGUAGE=1THEN
SELECTUTL_RAW.CONVERT(DBMS_LOB.SUBSTR(FILE_DATA,1000,FILE_LOC)
'AMERICAN_AMERICA.UTF8'
'AMERICAN_AMERICA.ZHT16BIG5'
)
INTOTEMP_DATA
FROMFND_LOBS
WHERE0=0
ANDFILE_ID=FLE_GFM_ID;
ELSE
SELECTDBMS_LOB.SUBSTR(FILE_DATA,1000,FILE_LOC)
INTOTEMP_DATA
FROMFND_LOBS
WHERE0=0
ANDFILE_ID=FLE_GFM_ID;
ENDIF;
FILE_LOC:
=FILE_LEN+2;
ENDIF;
--FND_MESSAGE.DEBUG('TEMP_DATA:
'||TEMP_DATA);
TEMP_DATA:
=LTRIM(RTRIM(UTL_RAW.CAST_TO_VARCHAR2(TEMP_DATA)));
TAB_LOC:
=1;
TAB_LOC_OLD:
=1;
MY_FIELD_LOC:
=1;
--FND_MESSAGE.DEBUG('COUNTER:
'||COUNTER);--第n筆
--FND_MESSAGE.DEBUG('TEMP_DATA:
'||TEMP_DATA);
IFCOUNTER>0THEN--第0行為抬頭標題不做insert
WHILE(MY_FIELD_LOC<=MY_FIELD_CNTANDTAB_LOC>0)
LOOP
TAB_LOC:
=INSTR(TEMP_DATA,V_COL_SEP,TAB_LOC_OLD);
IFTAB_LOC>0THEN
TEMP_TAB:
=REGEXP_REPLACE(SUBSTR(TEMP_DATA,TAB_LOC_OLD,TAB_LOC-TAB_LOC_OLD),chr(10),'');--去除空行
ELSE
TEMP_TAB:
=REGEXP_REPLACE(SUBSTR(TEMP_DATA,TAB_LOC_OLD),chr(10),'');--去除空行
ENDIF;
SYNCHRONIZE;--更新畫面欄位資料若速度過慢可拿除
TAB_LOC_OLD:
=TAB_LOC+1;
--Start該作業特別新增檢查
IFV_BLOCK||'.'||MY_FIELD(MY_FIELD_LOC)IN('TG_IMPORT_ITEM_TEMP.RECEIVING_ROUTING_ID','TG_IMPORT_ITEM_TEMP.ATTRIBUTE3',
'TG_IMPORT_ITEM_TEMP.SEGMENT1','TG_IMPORT_ITEM_TEMP.DESCRIPTION','TG_IMPORT_ITEM_TEMP.PRIMARY_UOM_CODE')THEN--檢查上傳檔案欄位內容
IFTEMP_TABISNULLTHEN
FND_MESSAGE.SET_STRING('上傳檔案內容錯誤!
!
'||chr(10)||'請檢查畫面上黃色必輸欄位是否為空!
!
');
FND_MESSAGE.SHOW;
CLEAR_FND_LOB;
RAISEFORM_TRIGGER_FAILURE;
ENDIF;
ENDIF;
--End該作業特別新增檢查
COPY(TEMP_TAB,V_BLOCK||'.'||MY_FIELD(MY_FIELD_LOC));
FND_MESSAGE.SET_STRING('資料導入中...請勿關閉視窗!
!
第'||COUNTER||'筆-'||TEMP_TAB||'導入成功!
!
');
FND_MESSAGE.HINT;
MY_FIELD_LOC:
=MY_FIELD_LOC+1;
ENDLOOP;
NEXT_RECORD;
ELSE--檢查抬頭欄位名稱是否和設定相同
WHILE(MY_FIELD_LOC<=MY_FIELD_CNTANDTAB_LOC>0)
LOOP
TAB_LOC:
=INSTR(TEMP_DATA,V_COL_SEP,TAB_LOC_OLD);
IFTAB_LOC>0THEN
TEMP_TAB:
=SUBSTR(TEMP_DATA,TAB_LOC_OLD,TAB_LOC-TAB_LOC_OLD);
ELSE
TEMP_TAB:
=SUBSTR(TEMP_DATA,TAB_LOC_OLD);
ENDIF;
TAB_LOC_OLD:
=TAB_LOC+1;
IFTEMP_TAB<>MY_FIELD(MY_FIELD_LOC)THEN
FND_MESSAGE.DEBUG(TEMP_TAB||'欄位與設定欄位'||MY_FIELD(MY_FIELD_LOC)||'不合,請檢查上傳檔案內容!
!
');
CLEAR_FND_LOB;
RAISEFORM_TRIGGER_FAILURE;
ENDIF;
MY_FIELD_LOC:
=MY_FIELD_LOC+1;
ENDLOOP;
ENDIF;
COUNTER:
=COUNTER+1;
EXITWHENFILE_LOC>=FILE_LEN;
ENDLOOP;
FIRST_RECORD;
FND_MESSAGE.SET_STRING('');--執行結束清空左下角訊息
FND_MESSAGE.HINT;
COUNTER:
=COUNTER-1;--排除不算抬頭行數
FND_MESSAGE.DEBUG('共導入'||COUNTER||'筆資料成功!
!
');
ENDIF;
----------------
--Deletetempdata
IFFLE_GFM_ID>=0THEN
:
PARAMETER.FLE_GFM_ID:
=FLE_GFM_ID;
ENDIF;
SELECTFILE_NAME
INTO:
PARAMETER.FLE_FILE_NAME
FROMFND_LOBS
WHERE0=0
ANDFILE_ID=FLE_GFM_ID;
--ClearLOBFile
CLEAR_FND_LOB;
V_MESG_LEVEL:
=:
SYSTEM.MESSAGE_LEVEL;
:
SYSTEM.MESSAGE_LEVEL:
='5';
:
SYSTEM.MESSAGE_LEVEL:
=V_MESG_LEVEL;
ENDLOAD_FILE;
PROCEDUREFILE_UPLOADIS
ACCESS_IDNUMBER;
L_PARAMETERSVARCHAR2(100);
BUTTON_CHOICEINTEGER;
L_FILE_IDVARCHAR2(100);
L_GFM_IDINTEGER;
BEGIN
ACCESS_ID:
=FND_GFM.AUTHORIZE(NULL);
L_PARAMETERS:
='access_id='||ACCESS_ID;
FND_FUNCTION.EXECUTE(FUNCTION_NAME=>'FND_FNDFLUPL'
OPEN_FLAG=>'Y'
SESSION_FLAG=>'Y'
OTHER_PARAMS=>L_PARAMETERS);
FND_MESSAGE.SET_STRING('檔案是否已上傳!
?
'||CHR(10)||
'請點選"確認"已上傳或"取消"返回畫面');
BUTTON_CHOICE:
=FND_MESSAGE.QUESTION('確認',NULL,'取消',1,3,'NOTE');
IF(BUTTON_CHOICE=3)THEN
L_GFM_ID:
=FND_GFM.GET_FILE_ID(ACCESS_ID);
:
PARAMETER.FLE_GFM_ID:
=L_GFM_ID;
CLEAR_FND_LOB;--若已上傳則刪除上傳檔
RAISEFORM_TRIGGER_FAILURE;
ELSIF(BUTTON_CHOICE=1)THEN
L_GFM_ID:
=FND_GFM.GET_FILE_ID(ACCESS_ID);
:
PARAMETER.FLE_GFM_ID:
=L_GFM_ID;
ENDIF;
IFL_GFM_IDISNULLTHEN--檢查是否上傳成功
FND_MESSAGE.DEBUG('檔案上傳不成功,煩請重新上傳!
!
');
RAISEFORM_TRIGGER_FAILURE;
ENDIF;
END;
PROCEDURECLEAR_FND_LOBIS
BEGIN
IF:
PARAMETER.FLE_GFM_ID>=0THEN
COPY('5','system.message_level');
DELETEFND_LOBS
WHERE0=0
ANDFILE_ID=:
PARAMETER.FLE_GFM_ID;
STANDARD.COMMIT;
COPY('0','system.message_level');
ENDIF;
ENDCLEAR_FND_LOB;
<備註二>
在BLOCKON-ERROR加入
DECLARE
V_ERROR_CODENUMBER;
V_ERROR_TEXTVARCHAR2(2000);
V_DBMS_ERROR_CODENUMBER;
V_DBMS_ERROR_TEXTVARCHAR2(2000);
BEGIN
V_ERROR_CODE:
=ERROR_CODE;
V_ERROR_TEXT:
=ERROR_TEXT;
V_DBMS_ERROR_CODE:
=DBMS_ERROR_CODE;
V_DBMS_ERROR_TEXT:
=DBMS_ERROR_TEXT;
IFV_ERROR_CODEISNOTNULLTHEN
SET_ALERT_PROPERTY('errmes',TITLE,'Info.'||LTRIM(TO_CHAR(V_ERROR_TEXT)));
SET_ALERT_PROPERTY('errmes',ALERT_MESSAGE_TEXT,V_ERROR_TEXT);
IF:
PARAMETER.FLE_GFM_ID>=0THEN
CLEAR_FND_LOB;
RAISEFORM_TRIGGER_FAILURE;--若錯誤則刪除檔案後停止
ENDIF;
ENDIF;
END;
在FORMCLOSE_WINDOW加入
IF:
PARAMETER.FLE_GFM_ID>=0THEN
CLEAR_FND_LOB;
ENDIF;
APP_CUSTOM.CLOSE_WINDOW(:
SYSTEM.EVENT_WINDOW);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 使用CSV导入Oracle Form 使用 CSV 导入 Oracle
![提示](https://static.bingdoc.com/images/bang_tan.gif)