Oracle 如何在sql loader中使用多个条件?

Oracle 如何在sql loader中使用多个条件?,oracle,sql-loader,Oracle,Sql Loader,我有一个以下格式的csv文件。第一列是id,第二列是name,第三列是dept。这个文件中有700k多行。我试图使用SQL Loader在oracle表中只移动部门10、90、30和70的详细信息 100,AAA,10 101,BBB,10 102,CCC,20 103,DDD,30 104,EEE,40 105,FFF,50 106,GGG,70 107,HHH,60 108,III,20 109,JJJ,80 110,KKK,90 111,LLL,90 112,MMM,50 113,NNN,

我有一个以下格式的csv文件。第一列是id,第二列是name,第三列是dept。这个文件中有700k多行。我试图使用SQL Loader在oracle表中只移动部门10、90、30和70的详细信息

100,AAA,10 101,BBB,10 102,CCC,20 103,DDD,30 104,EEE,40 105,FFF,50 106,GGG,70 107,HHH,60 108,III,20 109,JJJ,80 110,KKK,90 111,LLL,90 112,MMM,50 113,NNN,80 114,OOO,10 100,AAA,10 101、BBB、10 102,CCC,20 103,DDD,30 104,EEE,40 105,FFF,50 106,GGG,70 107,HHH,60 108、III、20 109,JJJ,80 110,KKK,90 111,LLL,90 112,嗯,50 113,NNN,80 114,哦,10 我的表格格式是:-

create table DEPT_LOADER( ID NUMBER ,NAME VARCHAR2(100) ,DEPT number ); 创建表DEPT\u LOADER( 身份证号码 ,姓名VARCHAR2(100) ,部门编号 ); 下面是控制文件

load data infile 'F:\SQL_Loader\dept.csv' badfile 'F:\SQL_Loader\dept.bad' discardfile 'F:\SQL_Loader\dept.dsc' insert into table DEPT_LOADER when dept = '10' or dept = '90' or dept = '30' or dept = '70' fields terminated by ',' (id,name,dept) 加载数据 填充“F:\SQL\u Loader\dept.csv” 错误文件“F:\SQL\u Loader\dept.bad” 丢弃文件“F:\SQL\u Loader\dept.dsc” 插入 进入表DEPT\u加载器 当dept='10'或dept='90'或dept='30'或dept='70' 以“,”结尾的字段 (身份证、姓名、部门) 但oracle在when子句中不允许使用“or”运算符。我尝试使用“in”子句,但得到了相同类型的错误

SQL*Loader-350: Syntax error at line 7. Expecting "(", found "or". when dept = '10' or dept = '90' or dept = '30' or dept = '70' SQL*Loader-350:第7行出现语法错误。 应为“(”,应为“或”。 当dept='10'或dept='90'或dept='30'或dept='70'
请帮助我。如何在控制文件中使用多个条件

SQL*Loader在
子句中不允许
运算符。您应该使用多个
插入DEPT\u Loader

load data infile 'F:\SQL_Loader\dept.csv' badfile 'F:\SQL_Loader\dept.bad' discardfile 'F:\SQL_Loader\dept.dsc' insert into table DEPT_LOADER when dept = '10' or dept = '90' or dept = '30' or dept = '70' fields terminated by ',' (id,name,dept) 你的控制文件应该是这样的

LOAD DATA
INFILE 'F:\SQL_Loader\dept.csv'
BADFILE 'F:\SQL_Loader\dept.bad'
DISCARDFILE 'F:\SQL_Loader\dept.dsc'
INSERT 
INTO TABLE DEPT_LOADER WHEN DEPT = '10'
FIELDS TERMINATED BY ','
(
ID POSITION(1),
NAME,
DEPT
)
INTO TABLE DEPT_LOADER WHEN DEPT = '90'
FIELDS TERMINATED BY ','
(
ID POSITION(1),
NAME,
DEPT
)
INTO TABLE DEPT_LOADER WHEN DEPT = ’30'
FIELDS TERMINATED BY ','
(
ID POSITION(1),
NAME,
DEPT
)
INTO TABLE DEPT_LOADER WHEN DEPT = ’70'
FIELDS TERMINATED BY ','
(
ID POSITION(1),
NAME,
DEPT
)

SQL*Loader不允许在
WHEN
子句中使用
运算符。您应该使用多个
插入到DEPT\u Loader

你的控制文件应该是这样的

LOAD DATA
INFILE 'F:\SQL_Loader\dept.csv'
BADFILE 'F:\SQL_Loader\dept.bad'
DISCARDFILE 'F:\SQL_Loader\dept.dsc'
INSERT 
INTO TABLE DEPT_LOADER WHEN DEPT = '10'
FIELDS TERMINATED BY ','
(
ID POSITION(1),
NAME,
DEPT
)
INTO TABLE DEPT_LOADER WHEN DEPT = '90'
FIELDS TERMINATED BY ','
(
ID POSITION(1),
NAME,
DEPT
)
INTO TABLE DEPT_LOADER WHEN DEPT = ’30'
FIELDS TERMINATED BY ','
(
ID POSITION(1),
NAME,
DEPT
)
INTO TABLE DEPT_LOADER WHEN DEPT = ’70'
FIELDS TERMINATED BY ','
(
ID POSITION(1),
NAME,
DEPT
)

我宁愿在将文件传递给sqlldr之前先过滤掉该文件。这样做是明智的,因为sqlloader的职责是按照您提供的方式将数据加载到数据库中,而不是过滤您的文件。在传递之前应该先进行清理。查看
F:
似乎您是在Windows环境中进行此操作的。在Unix中,我将使用类似于
awk'$3~/^(10 | 90 | 30 | 70)$/{print}的awk命令dept.csv>new_dept.csv
来过滤记录,然后加载
new_dept.csv
。另一个选项是使用外部表,从中可以获得预处理器选项来执行此类操作。感谢您的建议。是的,目前我正在使用Windows环境。您能建议我如何在Windows环境中过滤如此大量的数据吗s环境?我从不使用外部表。让我试试。我宁愿先过滤掉文件,然后再将其传递给sqlldr。这样做是明智的,因为sqlloader的职责是按照您提供的方式将数据加载到数据库中,而不是过滤您的文件。甚至在传递之前都应该进行清理。查看
F:
在Unix中,我会使用类似于
awk'$3~/^(10 | 90 | 30 | 70)$/{print}的awk命令dept.csv>new_dept.csv
来过滤记录,然后加载
new_dept.csv
。另一个选项是使用外部表,从中可以获得预处理器选项来执行此类操作。感谢您的建议。是的,目前我正在使用Windows环境。您能建议我如何在Windows环境中过滤如此大量的数据吗s环境?我从不使用外部表。让我尝试一下。上面的脚本只适用于第10部门,其他部门(90、30、70)被丢弃。我编辑了帖子,为每个插入到语句中添加了位置(1)。请检查此版本是否有效。是的,它正在工作。非常感谢。你能解释一下位置(1)吗或者参考我的任何文档。据我所知,位置用于固定长度的平面文件,具有适当的位置,如col_name position(开始位置:结束位置)。它强制SQL*Loader从数据中的特定位置开始加载。有关详细信息,您可以查看以下参考。上面的脚本仅适用于部门10,其他部门(90,30,70)将被丢弃。我使用位置(1)编辑了帖子为每个INSERT INTO语句添加。请检查此版本是否有效。是的,它现在正在工作。非常感谢。请您向我解释位置(1)或参考任何文档。据我所知,位置用于固定长度的平面文件,具有适当的位置,如col_name position(开始位置:结束位置)。它强制SQL*Loader从数据中的特定位置开始加载。有关详细信息,您可以查看以下参考。