请教个sqlldr 使用direct选项的问题!

riveryh 2010-10-26 01:50:53
创建如下临时表:
create table TEST
(
ID1 NUMBER(3) not null,
ID2 NUMBER(3) default 1 not null,
ID3 NUMBER(3) default 2 not null
)
其中ID1是主键

数据文件中只要ID2的值,ID1希望根据序列生成,ID3使用默认值
sqlldr的控制文件如下:
load data
INFILE 'test.txt'
INTO TABLE test
APPEND
FIELDS TERMINATED BY ','
TRAILING NULLCOLS(
ID2,
ID1 sequence(max,1)
)

数据文件内容如下:
3
2


我觉得这样配置时,导入的数据应该是ID1是自增的,ID2是文本文件中的,ID3为默认值
但执行sqlldr导入数据时
D:\>sqlldr user1/user1@testdb control=test.ctl direct=true log =test.log

SQL*Loader: Release 9.2.0.8.0 - Production on 星期二 10月 26 13:43:50 2010
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
SQL*Loader-951: 呼叫一次/加载初始化错误
ORA-26010: Column ID3 in table TEST is NOT NULL and is not being loaded

请教各位大侠,这个问题该怎么解决。数据文件是不能修改的,控制文件中也不能加ID3,多谢!
...全文
960 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
riveryh 2010-10-26
  • 打赏
  • 举报
回复
看来direct=TRUE和default不能同时用了,郁闷
ngx20080110 2010-10-26
  • 打赏
  • 举报
回复

Field Defaults on the Direct PathDefault column specifications defined in the database are not available when you use direct path loading. Fields for which default values are desired must be specified with the DEFAULTIF clause. If a DEFAULTIF clause is not specified and the field is NULL, then a null value is inserted into the database.

這是oracle 10g官方文檔關於direct的原文
心中的彩虹 2010-10-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wkc168 的回复:]
引用楼主 riveryh 的回复:
创建如下临时表:
create table TEST
(
ID1 NUMBER(3) not null,
ID2 NUMBER(3) default 1 not null,
ID3 NUMBER(3) default 2 not null
)
其中ID1是主键

数据文件中只要ID2的值,ID1希望根据序列生成,ID3使用默认值
sqlld……
[/Quote]
--direct=false

C:\>sqlldr scott/sys@orcl control=d:\sqlldr\test.ctl direct=false log=d:\test.lo
g

SQL*Loader: Release 10.2.0.1.0 - Production on 星期五 10月 22 15:06:07 2010

Copyright (c) 1982, 2005, Oracle. All rights reserved.

达到提交点 - 逻辑记录计数 1


SQL> select * from test
2 /

ID1 ID2 ID3
---------- ---------- ----------
1 3 2
心中的彩虹 2010-10-26
  • 打赏
  • 举报
回复
[Quote=引用楼主 riveryh 的回复:]
创建如下临时表:
create table TEST
(
ID1 NUMBER(3) not null,
ID2 NUMBER(3) default 1 not null,
ID3 NUMBER(3) default 2 not null
)
其中ID1是主键

数据文件中只要ID2的值,ID1希望根据序列生成,ID3使用默认值
sqlldr的控制文件如下:
lo……
[/Quote]
ORA-26010: Column ID3 in table TEST is NOT NULL and is not being loaded
id3 不能为空

或者
alter table test modify id3 default 2 null

要么把id3加进去


C:\>sqlldr scott/sys@orcl control=d:\sqlldr\test.ctl direct=true log=d:\test.log


SQL*Loader: Release 10.2.0.1.0 - Production on 星期五 10月 22 15:04:11 2010

Copyright (c) 1982, 2005, Oracle. All rights reserved.


加载完成 - 逻辑记录计数 1。
ngx20080110 2010-10-26
  • 打赏
  • 举报
回复
direct path是不會去處理default值的,所以只能不用direct選項了
在java代码中调用执行shell脚本,sqlldr导数与使用sqlplus在shell调用执行存储过程。 linux环境中有2个dba的用户:oracle、erm 还有1个web用户:erm 在linux环境中,这三个用户都可以直接在任意目录下执行该shell脚本,可是在java代码中调用shell脚本时,报了如下4个错误: 1、sqlldr: command not found 2、sqlplus: command not found 3、0750: You may need to set ORACLE_HOME to your Oracle software directory 4、Message 2100 not found; No message file for product=RDBMS, facility=ULMessage 2100 not found; No message file for product=RDBMS, facility=UL$ 检查了dba用户和web用户下关于oracle的所有环境变量发现没有问题 (/home/oracle/.profile 与 /home/erm/.profile 环境变量文件为隐藏文件需使用 ls -a 命令查看) 在网上查了一遍以后有如下几种处理办法: 1、没有oracle_home目录的执行权限,无法进入到bin目录,使用chmod 755 $oracle_home更改目录权限;使用chmod 755 $oracle_home/lib更改目录权限;对目录$oracle_home/rdbms/mesg目录赋予相应权限;当需要给非oracle用户配置使用sqlldr时,不单需要配置环境变量,还需要把相关目录的访问权限赋予该用户。【采用此法测试以后还是出现上面的错误】 2、用sh直接执行shell和在java直接执行shell是有区别的,要在shell文件内增加oracle的环境变量即. /home/oracle/.bash_profile 这句话,否则在执行sqlldr会报如下异常: Message 2100 not found; No message file for product=RDBMS...... facility=UL 【采用此法测试以后继续报错,但是这个方法有引导作用,继续往下看】 因为我在linux环境下执行shell脚本时sqlldr命令和sqlplus命令是正常执行的,没有任何问题,但是在java代码中调用脚本时却报错,所有排除了其他原因,只可能是环境变量的问题, 于是我把oracle的所有环境变量直接复制到shell脚本文件中,在java中调用了一下,然后所有问题迎刃而解! 具体代码参看文件内容

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧