为每个文件生成不同的序列号

时间:2019-05-23 01:56:42

标签: sql-loader

我正在使用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” )

1 个答案:

答案 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;
/