1

私はODI 12cを使用しているので、ミッションは1つのplatファイルを1つのテーブルOracleに挿入することです

ファイルは次のようなものです:

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

ファイルのすべてのテキストを保存する(行ごとに挿入する)1つの列「COL」(長さ= 250)を構成する1つのテーブル「A」があります。保存しますが、私のファイルの順序とは異なります。

のように保存します

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_NUMBERきれいではありませんが、に列を追加する必要がなくなりますA

于 2015-10-15T21:26:38.747 に答える