【问题标题】:Generate different sequence number for each file为每个文件生成不同的序列号
【发布时间】:2025-11-30 21:20:10
【问题描述】:

我正在使用 SQL-loader 将 .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 以“,”结尾的字段 可选地由 '"' 包围 尾随 NULLCOLS ( 第 1 列, 第 2 列, 第 3 列, 第 4 列, 第 5 列“NUMBER.NEXTVAL” )

【问题讨论】:

    标签: sql-loader


    【解决方案1】:

    我有一个类似的要求,我需要为加载到表中的每个文件的每一行添加一个 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;
    /
    

    【讨论】:

    • 嗨,加里,感谢您的评论,但如果我一次加载 2 个文件,这将起作用。我的意思是我的 INFILE 将有 sample*.csv。所以如果有 2 个文件,它只会为 2 个文件中的所有记录创建 1 个唯一 ID。对吗?
    • 我相信是的。对于实例化包的会话,日期和 ID 将是唯一的。不过,我从未按照您的意图尝试过。我很想知道结果!
    最近更新 更多