我正在使用SQL加载程序将.csv文件加载到我的oracle表中。我有多个文件具有相同的列。每个文件有大约500个奇数记录。我在表中有1个额外的列“ COLUMN5”,该列不在.csv文件中。我需要为每个.csv文件使用1个唯一编号更新COLUMN5。
就像第一个csv文件一样,它有500条记录,因此对于所有500条记录,它应该是1个唯一编号。 第二个csv文件具有300条记录,因此对于所有这300条记录,下一个唯一编号。 有什么办法可以做到这一点。我在下面做了。
我正在使用Number.Nextval序列,但是它为每条记录增加了一个数字。
下面是我的控制文件。
加载数据
INFILE'sample.csv'
INFILE'sample2.csv'
追加到表TABLE1中 以“,”结尾的字段 可选用“”包围 跟踪空卷 ( 第1栏, 第2栏, 第3栏, 第4栏, 第5栏“ NUMBER.NEXTVAL” )
答案 0 :(得分:0)
我有一个类似的要求,我需要为每个加载到表的文件的每一行添加一个load_date和序列ID。这样,就可以轻松按日期查询,或者如果需要“回退”某个文件,我们可以删除加载顺序ID与该文件匹配的位置。首先,我创建了一个名为X_LOAD_SEQ的序列来保存会话之间的当前值。然后,我创建了一个带有load_date和load_seq_id变量以及返回它们的函数的包。在程序包主体中,代码在设置值的实例化时运行。我在每个表中添加了LOAD_DATE和LOAD_SEQ_ID列,创建了包,并将这些行添加到了每个控制文件的末尾(请注意,表不能已经包含具有这些名称的列):
,LOAD_DATE date "MM/DD/YYYY" "to_char(trunc(schema.load_seq.get_load_date), 'mm/dd/yyyy')"
,LOAD_SEQ_ID decimal external "schema.load_seq.get_load_seq_id"
包装:
CREATE OR REPLACE PACKAGE SCHEMA.LOAD_SEQ AS
/******************************************************************************
NAME: LOAD_SEQ
PURPOSE: Sets unique load_date and Load_seq_id per session when
the package is instantiated. Package functions are
intended to be called from control files so all rows in a
file load will have the same load_date and load_seq_id.
When the functions are called, the package is instantiated and
the code at the bottom is run once for the session, setting the
load_date and load_seq_id. The functions simply return the values
which will remain the same for that session.
EXAMPLE: ,LOAD_SEQ_ID DECIMAL EXTERNAL "load_seq.get_load_seq_id"
(each row then has the same load_seq_id).
REVISIONS:
Ver Date Author Description
--------- ---------- --------------- ------------------------------------
1.0 2/20/2017 Gary_W 1. Created this package.
******************************************************************************/
NEXT_LOAD_SEQ_ID NUMBER;
NEXT_LOAD_DATE DATE;
FUNCTION GET_LOAD_SEQ_ID RETURN NUMBER;
FUNCTION GET_LOAD_DATE RETURN DATE;
END LOAD_SEQ;
/
CREATE OR REPLACE PACKAGE BODY SCHEMA.LOAD_SEQ AS
FUNCTION GET_LOAD_SEQ_ID RETURN NUMBER IS
BEGIN
RETURN LOAD_SEQ.NEXT_LOAD_SEQ_ID;
END GET_LOAD_SEQ_ID;
FUNCTION GET_LOAD_DATE RETURN DATE IS
BEGIN
RETURN LOAD_SEQ.NEXT_LOAD_DATE;
END GET_LOAD_DATE;
BEGIN
-- This code is run once, when the package is first called by the session.
-- It sets the package variables which then do not change during the life of the session.
SELECT SYSDATE, X_LOAD_SEQ.NEXTVAL
INTO LOAD_SEQ.NEXT_LOAD_DATE, LOAD_SEQ.NEXT_LOAD_SEQ_ID
FROM DUAL;
END LOAD_SEQ;
/