在 oracle 中以不同的顺序插入行 table
insert rows in different order in oracle table
我正在使用 ODI 12c,所以任务是将一个 plat 文件插入到一个 table Oracle
文件如下:
H030201707761133020171085009CA0126357320150506141438SL xxxx xxx xxx
***DEB062
09001SD
1003020171085009
....
...
..
.
.
.
0000010000001389600000013896
509000002
199
***FIN062
我有一个 table 'A' 构成一列 'COL' (lenght=250),我想在其中保存所有文件的文本(逐行插入)。它保存它但不像我的文件顺序为什么!
它像
一样保存
1003020171085009
xxxx
1003020171085009
....
...
..
***FIN062
.
H030201707761133020171085009CA0126357320150506141438SL xxxx xxx xxx
.
509000002
199
0000010000001389600000013896
关系数据库中 table 中的行没有 'order'。除非您在 SELECT 语句中提供 ORDER BY 子句,否则数据库可以自由选择 return 行。我建议您向 table 添加另一列,也许称为 LINE_NUMBER,您可以在其中存储一个 "line number" 值,您可以使用该值对 table 中的行进行排序你愿意。
祝你好运。
编辑
如果您真的不想添加列来对数据进行排序,您始终可以在 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;
然后当你想按照行添加到 table 的顺序通读 A
时,你可以这样做:
SELECT SUBSTR(COL, 9)
FROM A
ORDER BY TO_NUMBER(SUBSTR(COL, 1, 8);
不漂亮,但它避免了必须将 LINE_NUMBER
列添加到 A
。
我们找到了一个解决方案。如果您使用的是 ODI,则只需在 INSERT_HINT 输入文本中不输入任何内容。将其清空,如下图所示...它会按原样保存您的行平台文件
我正在使用 ODI 12c,所以任务是将一个 plat 文件插入到一个 table Oracle
文件如下:
H030201707761133020171085009CA0126357320150506141438SL xxxx xxx xxx
***DEB062
09001SD
1003020171085009
....
...
..
.
.
.
0000010000001389600000013896
509000002
199
***FIN062
我有一个 table 'A' 构成一列 'COL' (lenght=250),我想在其中保存所有文件的文本(逐行插入)。它保存它但不像我的文件顺序为什么!
它像
一样保存1003020171085009
xxxx
1003020171085009
....
...
..
***FIN062
.
H030201707761133020171085009CA0126357320150506141438SL xxxx xxx xxx
.
509000002
199
0000010000001389600000013896
关系数据库中 table 中的行没有 'order'。除非您在 SELECT 语句中提供 ORDER BY 子句,否则数据库可以自由选择 return 行。我建议您向 table 添加另一列,也许称为 LINE_NUMBER,您可以在其中存储一个 "line number" 值,您可以使用该值对 table 中的行进行排序你愿意。
祝你好运。
编辑
如果您真的不想添加列来对数据进行排序,您始终可以在 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;
然后当你想按照行添加到 table 的顺序通读 A
时,你可以这样做:
SELECT SUBSTR(COL, 9)
FROM A
ORDER BY TO_NUMBER(SUBSTR(COL, 1, 8);
不漂亮,但它避免了必须将 LINE_NUMBER
列添加到 A
。
我们找到了一个解决方案。如果您使用的是 ODI,则只需在 INSERT_HINT 输入文本中不输入任何内容。将其清空,如下图所示...它会按原样保存您的行平台文件