您可以对传入的数据进行转换。它在控制文件中指定。有关示例,请参阅此最近的帖子:SQLLDR CTL:将 DDMonYYYY 中收到的日期字段加载到格式为 YYYYMM 或 MM/DD/YYYY 的 db 字段中
我会使用 REGEXP_SUBSTR 从逗号分隔列表中的位置提取各种代码。试一试,让我们知道会发生什么。
看起来您的目标表将具有有限数量的代码列。如果您的数据的 coeds 比目标表的列数多怎么办?考虑为一个项目创建自己的代码表,以免违反第一范式(每列只有一个值)。
如果源文件中的代码字符串确实是作为项目一部分的描述,那么它们很可能应该作为 code_description 列保留在一起。这取决于您的应用或报告如何使用这些数据。
话虽如此,诀窍是将代码字段定义为 BOUNDFILLER。这表示将其视为 FILLER 而不是加载它,而是让它在以后的表达式中用作绑定变量。在你的控制文件中试试这个:
LOAD DATA
INFILE 'data.txt'
APPEND
INTO TABLE X_TEST
FIELDS TERMINATED BY '|'
TRAILING NULLCOLS
(
STYLE CHAR
,SIZE CHAR
,CODESTRING BOUNDFILLER
,CODE1 "trim(regexp_substr(:CODESTRING, '([^,]*)(,|$)', 1, 1, NULL, 1))"
,CODE2 "trim(regexp_substr(:CODESTRING, '([^,]*)(,|$)', 1, 2, NULL, 1))"
,CODE3 "trim(regexp_substr(:CODESTRING, '([^,]*)(,|$)', 1, 3, NULL, 1))"
)
正则表达式可以读作“返回第 n 次出现的零个或多个非逗号字符后跟逗号或行尾,并返回第一个子组(即数据减去逗号或行尾)行)。只需将其包装在对 TRIM() 的调用中以删除空格或等待 REGEXP 向导之一提供改进的 REGEX。如果只有 2 个代码,则 CODE3 将为 NULL。