0

动态识别外部表中的列

我们有一个流程,我们通过 SQL 加载程序从多个立法(例如美国、菲律宾、拉丁美洲)上传员工数据。这种情况每周至少发生一次,当前的流程是他们每次加载员工信息时都会创建一个控制文件,使用 SQL*Loader 将其加载到临时表中。

我希望通过创建一个外部表并运行一个并发请求来将数据放入我们的暂存表中来简化这个过程。我遇到了两个绊脚石:

有一些列未被某些立法使用。

示例:美国使用“Veteran_Information”列,而菲律宾和拉丁美洲不使用。菲律宾使用“SSS_Number”,而美国和拉丁美洲不使用。拉丁美洲使用“Medical_Insurance”栏,而美国和菲律宾则不使用。如下所示:

US:     LEGISLATION, EMPLOYEE_NUMBER, DATE_OF_BIRTH, VETERAN_INFORMATION
PHL:    LEGISLATION, EMPLOYEE_NUMBER, DATE_OF_BIRTH, SSS_NUMBER
LAT:    LEGISLATION, EMPLOYEE_NUMBER, DATE_OF_BIRTH, MEDICAL_INSURANCE

业务用户不使用标准 CSV 模板/格式。

由于文件是由非 IT 业务用户发送的,因此他们通常不遵循规定的格式。(可能是培训/用户问题)。他们经常不遵循正确的列顺序 他们经常不遵循正确的列数 他们经常不遵循正确的列名称 如下所示:

US:     LEGISLATION, EMPLOYEE_ID, VETERAN_INFORMATION, DATE_OF_BIRTH, EMAIL_ADD
PHL:    EMP_NUM, LEGISLATION, DOB, SSS_NUMBER, EMAIL_ADDRESS
LAT:    LEGISLATION, PS_ID, BIRTH_DATE, EMAIL, MEDICAL_INSURANCE

外部表是否有办法识别列的正确顺序和命名,即使它们在文件中的顺序/命名约定不正确?

从问题 2 中获取列数据:

US:     LEGISLATION | EMPLOYEE_ID | VETERAN_INFORMATION | DATE_OF_BIRTH | EMAIL_ADD
        US          | 111         | No                  | 1967          | vet@gmail.com  

PHL:    EMP_NUM |  LEGISLATION  | DOB   | SSS_NUMBER | EMAIL_ADDRESS
        222     |  PHL          | 1898  | 456789     | pinoy@gmail.com

LAT:    LEGISLATION | PS_ID     | BIRTH_DATE | EMAIL         | MEDICAL_INSURANCE
        HON         | 333       | 1956       | hon@gmail.com | Yes

当它出现在外部表中时,我希望它是这样的:

    LEGISLATION | EMPLOYEE_NUMBER | DATE_OF_BIRTH | VETERAN_INFORMATION | SSS_NUMBER | MEDICAL_INSURANCE | EMAIL_ADDRESS
    US          | 111             | 1967          | Y                   | (NULL)     | (NULL)            | vet@gmail.com  
    PHL         | 222             | 1898          | (NULL)              | 456789     | (NULL)            | pinoy@gmail.com
    HON         | 333             | 1956          | (NULL)              | (NULL)     | Yes               | hon@gmail.com

有没有办法让外部表做类似上面的事情?

提前致谢!

4

1 回答 1

0

最简单的方法是:为每种类型的输入(US、PHL、HON)使用三个不同的加载脚本。每个脚本只是丢弃其他 2 种记录类型,并将列(可能进行一些转换,如“否”->“N”)放在正确的位置,并为该记录类型不存在的列插入 NULL。

于 2017-02-01T23:08:39.070 回答