1

我正在使用 ODI 12c,因此任务是将一个 plat 文件插入到一个表 Oracle

该文件是这样的:

H030201707761133020171085009CA0126357320150506141438SL xxxx xxx xxx                         
***DEB062
09001SD
1003020171085009
....
...
..
.
.
.
0000010000001389600000013896               
509000002
199
***FIN062

我有一张表'A',它构成一列'COL'(长度= 250),我想在其中保存所有文件的文本(逐行插入)。它保存它但不像我的文件顺序为什么!

它像保存它一样

1003020171085009
xxxx
1003020171085009
....
...
..
***FIN062
.
H030201707761133020171085009CA0126357320150506141438SL xxxx xxx xxx
.               
509000002
199
0000010000001389600000013896
4

2 回答 2

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_NUMBERA.

于 2015-10-15T21:26:38.747 回答
0

我们找到了一个解决方案。如果您使用的是 ODI,您只需要在 INSERT_HINT 输入文本中放置任何内容。让它为空,如下图所示...它会将您的行保存在 plat 文件中

在此处输入图像描述

于 2015-10-23T09:58:40.853 回答