在oracle表中以不同的顺序插入行

时间:2015-10-15 21:20:28

标签: oracle insert oracle-data-integrator

我正在使用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

2 个答案:

答案 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)

我们找到了一个解决方案。如果你正在使用ODI,你只需要在INSERT_HINT输入文本中没有任何内容。如下图所示,它是空的...它会保存你的行,因为它们在平台文件中

enter image description here