在 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 输入文本中不输入任何内容。将其清空,如下图所示...它会按原样保存您的行平台文件