动态识别外部表中的列

时间:2016-12-11 07:24:41

标签: oracle external-tables

动态识别外部表中的列

我们有一个流程,我们通过SQL Loader从多个法律(例如美国,菲律宾,拉丁美洲)上传员工数据。 这种情况至少每周发生一次,当前流程是每次加载员工信息时都会创建一个控制文件, 使用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

外部表有没有办法像上面那样做什么?

提前致谢!

1 个答案:

答案 0 :(得分:0)

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