我正在使用ODI 12c,因此任务是将一个平台文件插入一个表Oracle
文件如下:
H030201707761133020171085009CA0126357320150506141438SL xxxx xxx xxx
***DEB062
09001SD
1003020171085009
....
...
..
.
.
.
0000010000001389600000013896
509000002
199
***FIN062
我有一个表'A',它构成一列'COL'(lenght = 250),我要保存所有文件的文本(逐行插入)。它保存但不喜欢在我的文件顺序中为什么!
它像
一样保存1003020171085009
xxxx
1003020171085009
....
...
..
***FIN062
.
H030201707761133020171085009CA0126357320150506141438SL xxxx xxx xxx
.
509000002
199
0000010000001389600000013896
答案 0 :(得分:3)
关系数据库中的表中的行没有“顺序”。除非您使用SELECT语句提供ORDER BY子句,否则数据库可以自由返回它选择的行。我建议您在表中添加另一列,可能称为LINE_NUMBER,您可以在其中存储“行号”值,您可以使用该值来按顺序对表中的行进行排序。
祝你好运。
如果您确实不想添加列来对数据进行排序,则始终可以在COL
列的文本中嵌入序列号。例如,您可以将序列号存储为文件的前8个字符,方式类似于以下内容:
DECLARE
nLine_number NUMBER;
strLine VARCHAR2(250);
f UTL_FILE.FILE_TYPE;
BEGIN
f := UTL_FILE.FOPEN('dir', 'file', 'r');
SELECT COUNT(*)
INTO nLine_number
FROM A;
BEGIN
WHILE TRUE THEN
UTL_FILE.GET_LINE(f, strLine, 242); -- 8 less than size of A.COL
-- Insert new line into A.COL
nLine_number := nLine_number + 1;
INSERT INTO A(COL)
VALUES (TO_CHAR(nLine_number, '00000000') || strLine);
LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN
UTL_FILE.FCLOSE(f);
END;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
UTL_FILE.FCLOSE_ALL;
RAISE;
END;
然后,当您想按顺序阅读A
时,可以将行添加到表格中:
SELECT SUBSTR(COL, 9)
FROM A
ORDER BY TO_NUMBER(SUBSTR(COL, 1, 8);
不太好,但它避免了向LINE_NUMBER
添加A
列。
答案 1 :(得分:0)