簡介
有一個 CSV 檔案,內容如下:
帳號,日期,支出金額,存入金額,備註
,02/03/2025,1000,,ATM/自行交易
,02/03/2025,,2400,票交媒體行政院發
要取得每列的欄位資料並產生 insert 語法, 將資料寫入資料表中。
Oracle Apex 的 APEX_DATA_PARSER 套件的 parse
方法可以將 CSV 檔案的內容轉換成資料表的格式。
之後可以使用 insert
語法將資料寫入資料表中。
使用 APEX_DATA_PARSER 套件
APEX_DATA_PARSER.PARSE 函數回傳 apex_t_parser_table pipelined
的資料型態,這是一個 pipelined table function, 可以放入 TABLE() 中,轉成 FROM 子句的資料來源。
parse()
的必要參數有:
p_content_type:BLOB 物件的內容類型
p_file_name, p_file_type, p_file_profile 三者其中之一
p_file_name 用來推斷檔案的類型, 可用 p_file_type 明確指定檔案類型。
我們使用 CURSOR FOR LOOP 來讀取資料,並印出每一列的資料。
DECLARE
l_clob CLOB := q'[
帳號,日期,支出金額,存入金額,備註
,02/03/2025,1000,,ATM/自行交易
,02/03/2025,,2400,票交媒體行政院發
]';
-- 將 CLOB 轉成 BLOB
l_blob BLOB := UTL_I18N.STRING_TO_RAW(l_clob, 'AL32UTF8');
-- 定義一個 CURSOR
cursor txn_cursor is
select line_number, col001, col002, col003, col004
from table(APEX_DATA_PARSER.parse(
p_content => l_blob,
p_file_name => 'test.csv'));
BEGIN
-- Use the cursor to iterate through the rows
FOR r_row IN txn_cursor
loop
dbms_output.put_line('LINE_NUMBER: ' || r_row.line_number);
dbms_output.put_line('col001: ' || r_row.col001);
dbms_output.put_line('col002: ' || r_row.col002);
dbms_output.put_line('col003: ' || r_row.col003);
dbms_output.put_line('col004: ' || r_row.col004);
dbms_output.put_line('--------------------------------');
end loop;
end;
執行結果
產生 INSERT 語法
修改 loop 中的程式碼,將每一列的資料轉成 INSERT 語法:
...
FOR r_row IN txn_cursor
loop
insert into test_table(col001, col002, col003, col004)
values
(
r_row.col001,
r_row.col002,
r_row.col003,
r_row.col004
)
end loop;
-- loop 後 commit;
commit;
...
在 Oracle Apex 中使用
在 Oracle Apex 頁面中我們會使用 FILE_UPLOAD 元件來上傳 CSV 檔案.
FILE_UPLOAD 元件的儲存類型預設為 APEX_APPLICATION_TEMP_FILES, 我們需要從 APEX_APPLICATION_TEMP_FILES 中取得上傳的檔案。
-- 取得上傳檔案內容
SELECT blob_content INTO l_blob
FROM apex_application_temp_files
WHERE name = :P9_CSV_UPLOAD; -- 請用你實際的 File Browse 元件名稱
之後,就可依照上面的程式碼來處理 CSV 檔案了。
提醒
匯入前,先檢查 CSV 檔案的內容,確保資料正確無誤。
參考資料