Как я могу установить параметры во внешней таблице? - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь создать внешнюю таблицу из CSV-файла с SQL.Файл CSV имеет следующую структуру:

I001234
I012344
I000234
...

Я написал этот код для загрузки:

create table Arranger_check(
matriid char(8))
organization external (
type oracle_loader default directory ext_tab_data access parameters
(
records delimited by newline 
)
location('file.csv')) reject limit unlimited;

Если я попытаюсь опросить дб, результат будет неправильным.У меня есть восемь цифр и последний пробел 32 (ASCII).В результате запрос с IN или NOT IN не работает.

matriid
--------
I001234
I012344
I000234
...

Я пытался изменить matriid char (8) в char (7), но при создании таблицы загружается 0 строк.

1 Ответ

0 голосов
/ 27 сентября 2018

Если вы определите свой столбец как char(8), тогда он всегда будет дополнен пробелами, независимо от того, есть ли в файле значение пробелов или нет: если я сделаю файл смешанным:

create table Arranger_check(
matriid char2(8))
...

select matriid, length(matriid), dump(matriid) as dumped
from Arranger_check;

MATRIID  LENGTH(MATRIID) DUMPED                                  
-------- --------------- ----------------------------------------
I001234                8 Typ=96 Len=8: 73,48,48,49,50,51,52,32   
I012344                8 Typ=96 Len=8: 73,48,49,50,51,52,52,32   
I000234                8 Typ=96 Len=8: 73,48,48,48,50,51,52,32   

При varchar2 значение столбца будет иметь пробелы только в том случае, если в файле есть конечные пробелы, поэтому для одного и того же файла со смесью вы получите переменную длину в таблице:

create table Arranger_check(
matriid varchar2(8))
...

select matriid, length(matriid), dump(matriid) as dumped
from Arranger_check;

MATRIID  LENGTH(MATRIID) DUMPED                                  
-------- --------------- ----------------------------------------
I001234                8 Typ=1 Len=8: 73,48,48,49,50,51,52,32    
I012344                7 Typ=1 Len=7: 73,48,49,50,51,52,52       
I000234                7 Typ=1 Len=7: 73,48,48,48,50,51,52       

Если вы хотите, чтобы значения столбцане иметь конечных пробелов, даже если значения файлов есть, их нужно обрезать, если они существуют:

create table Arranger_check(
matriid varchar2(8))
organization external (
type oracle_loader default directory ext_tab_data access parameters
(
  records delimited by newline
  fields
  (
    matriid char(8) rtrim
  )
)
location('file.csv')) reject limit unlimited;

Затем с тем же файлом со смесью значений с пробелами и без них:

select matriid, length(matriid), dump(matriid) as dumped
from Arranger_check;

MATRIID  LENGTH(MATRIID) DUMPED                                  
-------- --------------- ----------------------------------------
I001234                7 Typ=1 Len=7: 73,48,48,49,50,51,52       
I012344                7 Typ=1 Len=7: 73,48,49,50,51,52,52       
I000234                7 Typ=1 Len=7: 73,48,48,48,50,51,52       

Обратите внимание, что rtrim не будет иметь никакого реального эффекта, если вы будете придерживаться char(8), так как именно этот тип данных вызывает повторное заполнение всех значений пробелами до полного размера столбца.Вам нужно использовать varchar2(8).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...