oracle - 在 Oracle 中为外部表创建存储(和自动化)过程
问题描述
首先,提前感谢您的回答。
这个问题是关于外部表和过程的。
我将一些 .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
)
);
并制定了将数据从 External Table 加载到 Final Table的程序,我是否还包括数据移动的实际日期时间。
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;
目的是让一切自动化。因此,我想创建一个程序,允许 External Table 从csv 文件收集数据,然后将这些数据移动到 Final Table。
注意:csv 文件每周都会有所不同。因此,在收集新数据之前,必须删除外部表的旧内容。
我的问题是:是否可以创建一个程序来删除以前的内容并将数据从 csv 文件收集到外部表?
也许有更简单的方法...
再次感谢你!
解决方案
在您的外部表上创建MATERIALIZE VIEW并在每次新文件到达时执行完全刷新。
如果有一些文件命名模式,因此文件名发生变化,请在刷新之前另外执行ALTER TABLE以调整文件名位置。
例如
ALTER TABLE xxx
LOCATION ('my_new_file');
使用 MATERIALIZE VIEW,您不需要任何程序来刷新数据,只需调用
dbms_mview.refresh('my_materialzed_view','C');
在后台执行 TRUNCATE,然后执行来自外部表的 INSERT APPEND。
推荐阅读
- python - 编写一个快速(数组运算)函数,求解一列中的函数以获得下一个函数值
- javascript - 为什么对 fetch 响应使用解构赋值会导致 .json() 方法消失?
- ionic-framework - 电容器和离子上的 MapKit JS
- visual-studio-2010 - 使用 Visual Studio 2010 重建
- python - 在 Anaconda 环境中安装 AutoSKLearn
- swift - 是否可以从 String 继承自定义类?
- sql - 来自 TSQL 中表的 XML 具有不同的属性值
- php - PHP中的MySQL SELECT查询不返回与直接查询数据库相同的结果
- python - 如何调用 Postgresql 数据库中具有特殊字符的字段名称?
- postgresql - 分层 BOM 的最佳数据结构是什么