【发布时间】:2017-02-02 07:08:39
【问题描述】:
动态识别外部表中的列
我们有一个流程,通过 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
有没有办法让外部表做类似上面的事情?
提前致谢!
【问题讨论】:
-
在 Oracle 中创建外部表时,必须指定结构/列顺序,即它是固定的。我建议为每种文件类型创建一个单独的表,然后使用合并的视图/快照来驱动您的本地处理。或者,对每个文件进行预处理以标准化其格式。