Используйте количество символов в качестве разделителя sql - PullRequest
0 голосов
/ 09 июля 2020

У меня есть такое упражнение: наличие этого типа текстового файла

10012020/07/057
10022020/07/055
10032020/07/100
10042020/07/079
10052020/07/103
10062020/07/098
10072020/07/104
10082020/07/101
10092020/07/104
10102020/07/063

Вставьте записи во внешнюю таблицу (как в приведенной ниже), используя количество символов в качестве разделителя.

CREATE TABLE Ftest ( 
  idF   VARCHAR(255),
  dt   DATE,
  n      VARCHAR(255)
)
ORGANIZATION EXTERNAL
  (
    TYPE oracle_loader
  DEFAULT DIRECTORY desktop    
  ACCESS PARAMETERS
  ( 
    RECORDS DELIMITED BY '\n'
    BADFILE     CHARACTER
      DISCARDFILE CHARACTER
      LOGFILE     CHARACTER
      FIELDS TERMINATED BY ','
      OPTIONALLY ENCLOSED BY "'"
      MISSING FIELD VALUES ARE NULL     
      (
        idF     CHAR(255),
        dt      CHAR(255) date_format DATE mask 'YYYY/MM/DD',
        numero  CHAR(255)
      )  
  )
  LOCATION ('Test.csv')
)
REJECT LIMIT UNLIMITED;

Взяв первую запись, у меня есть: 10012020/07/057 так

  • Поле 1 (idF) = 1001 [4 символа]
  • Поле 2 (dt) = 2020/07/05 [10 символов]
  • Поле 3 (n) = 7 [1 символ]

Понятия не имею, что sql команды, используемые для указания разделителя для каждого поля. Есть ли у вас какие-либо предложения? Или решение изменить файл до того, как он будет вставлен в таблицу, но всегда на языке sql?

1 Ответ

0 голосов
/ 09 июля 2020

Это, очевидно, Oracle. Следовательно: поскольку разделителей нет, вам придется получать данные позиционно . Вот как:

SQL> CREATE TABLE Ftest (
  2    idF        VARCHAR(4),
  3    dt         DATE,
  4    numero     VARCHAR(1)
  5  )
  6  ORGANIZATION EXTERNAL
  7    (
  8      TYPE oracle_loader
  9      DEFAULT DIRECTORY EXT_DIR
 10      ACCESS PARAMETERS
 11      (
 12        RECORDS DELIMITED BY newline
 13        LOGFILE 'ftest.log'
 14        fields
 15          (idf    position(1:4),
 16           dt     position(5:14) date 'yyyy/mm/dd',
 17           numero position(15:15)
 18          )
 19      )
 20    LOCATION ('exercise.txt')
 21  )
 22  REJECT LIMIT UNLIMITED;

Table created.

Работает?

SQL> select * from ftest;

IDF  DT       N
---- -------- -
1001 05.07.20 7
1002 05.07.20 5
1003 10.07.20 0
1004 07.07.20 9
1005 10.07.20 3
1006 09.07.20 8
1007 10.07.20 4
1008 10.07.20 1
1009 10.07.20 4
1010 06.07.20 3

10 rows selected.

SQL>

На всякий случай, если вы не знали: в строке №9 упоминается каталог. Это объект Oracle, который создается пользователем SYS и указывает на каталог, расположенный на сервере базы данных. Глядя на ваш пример кода, как будто вы хотите загрузить данные со своего рабочего стола. Это не сработает (если ваш P C также не является сервером базы данных, и вы назвали этот каталог desktop).

Кроме того, SYS должен предоставить привилегии пользователю, который будет использовать каталог, например,

grant read, write on directory ext_dir to scott;
...