首先,预先感谢您的回答。
此问题与外部表和过程有关。
我将在目录中存储一些.csv文件,并且必须将所有这些数据添加到表中。
我的想法是:
将csv文件数据加载到外部表中
将所有数据从外部表插入到最终表中
我已经创建了将代码从 csv文件加载到外部表
的代码 CREATE TABLE "INFO"."DEVICE_EXTERNAL"
(
"Serial Number" VARCHAR2(100),
"Status" VARCHAR2(100),
"Install Date" VARCHAR2(100)
)
ORGANIZATION EXTERNAL
( TYPE ORACLE_LOADER
DEFAULT DIRECTORY "ER_IN_FILES"
ACCESS PARAMETERS
( RECORDS DELIMITED BY newline
SKIP 1
FIELDS TERMINATED BY '|'
optionally enclosed BY '"'
MISSING FIELD VALUES ARE NULL
(
"Serial Number" char,
"Status" char,
"Install Date" char
)
)
LOCATION
( "INFO":'device_data_week3.csv' ---csv file
)
);
并做了一个将数据从“外部表”加载到“最终表”的过程,如果我还包括了数据移动的实际日期时间。
Procedure Move_External_Final AS
v_upload_date DATE := SYSDATE;
v_company varchar(1) := '1';
BEGIN
BEGIN
INSERT INTO SMART_MAP
(DATA_DATE,
COMPANY,
"Serial Number",
"Status",
"Install Date"
)
SELECT
v_upload_date,
v_company,
"Serial Number",
"Status",
to_date("Install Date")
from DEVICE_EXTERNAL ;
COMMIT;
EXCEPTION
WHEN no_data_found
THEN
dbms_output.put_line ( 'EXC FAIL INSERT');
END ;
END Move_External_Final;
目标是使一切自动化。因此,我想创建一个过程,使外部表可以从 csv文件中收集数据,然后将这些数据移动到最终表中。
注意: csv文件将每周不同。因此,必须先删除外部表旧内容,然后再收集新数据。
我的问题是:是否可以创建一个程序来删除以前的内容并将数据从csv文件收集到外部表中?
也许有更简单的方法...
再次感谢您!
答案 0 :(得分:0)
在外部表上创建MATERIALIZE VIEW,并在每次新文件到达时执行完全刷新。
如果有一些文件命名模式,以便文件名发生更改,请在刷新ALTER TABLE之前执行另外的操作以调整文件名的位置。
例如
ALTER TABLE xxx
LOCATION ('my_new_file');
使用MATERIALIZE VIEW,您无需任何步骤即可刷新数据,只需调用
dbms_mview.refresh('my_materialzed_view','C');
在后台执行TRUNCATE,然后从外部表进行INSERT APPEND。