目前有个需求,就是定时从ftp上提取数据保存在一个ss.txt文件中,然后将内容导入数据库,我的数据库版本是oracle10g。
假设需要的导入数据库的内容如下:
张三,22,男,
李四,23,女,
王五,24,男,
赵六,25,女另创建一个input.ctl文件来将数据导入相应的表:
LOAD DATA
INFILE  'd:\ss.txt'
INSERT INTO TABLE CABINT.USERS
FIELDS TERMINATED BY ","
(name,
sex,
age) 打开运行,输入cmd,输入如下语句:
sqlldr  userid=test/ych@orcl control =d:\input.ctl显示信息:
达到提交点-逻辑记录技术1请问为什么没有添加成功,这个信息不是添加成功的意思吗?我有哪步做错了?

解决方案 »

  1.   

    将格式化的文本数据上载到表中去
    以表emp为例
    首先编写一个控制命令的脚本文件,通常以ctl结尾,内容如下:
    emp.ctl
    load data
    append
    into table emp
    fields terminated by ‘|’
    (
    no                float external,
            name        char(20),
            age                integer external,
            duty                char(1),
            salary        float external,
            upd_ts        date(14) ‘YYYYMMDDHH24MISS’
    )
    括号里对数据文件里每个数据域进行解释,以此在上载时与目标表进行比对。
    除了append外,还有insert、replace、truncate等方式,与append大同小异,不作更多的解释。
    再将上载数据组织成数据文件,通常以dat结尾,内容如下:
    emp.dat
    100000000001|Tom|000020|1|000000005000|20020101000000
    100000000002|Jerry|000025|2|000000008000|20020101235959
    分隔符要与ctl文件中fields terminated by指定的一致,这个例子中为“|”
    ctl和dat文件就绪后可以执行上载,命令为:
    sqlldr dbuser/oracle control=emp.ctl data=emp.dat
    也可以将dat文件合并在ctl文件中,ctl文件改写为:
    emp2.ctl
    load data
    infile *
    append
    into table emp
    fields terminated by ‘|’
    (
    no                float external,
            name        char(20),
            age                integer external,
            duty                char(1),
            salary        float external,
            upd_ts        date(14) ‘YYYYMMDDHH24MISS’
    )
    begindata
    100000000003|Mulder|000020|1|000000005000|20020101000000
    100000000004|Scully|000025|2|000000008000|20020101235959
    控制文件中infile选项跟sqlldr命令行中data选项含义相同,如使用infile *则表明数据在本控制文件以begin data开头的区域内。
    这样命令变成:
    sqlldr dbuser/oracle control=emp2.ctl
    conventional path
    通过常规通道方式上载。
    rows:每次提交的记录数
    bindsize:每次提交记录的缓冲区
    readsize:与bindsize成对使用,其中较小者会自动调整到较大者
    sqlldr先计算单条记录长度,乘以rows,如小于bindsize,不会试图扩张rows以填充bindsize;如超出,则以bindsize为准。
    命令为:
    sqlldr dbuser/oracle control=emp.ctl log=emp.log rows=10000 bindsize=8192000
    direct path
    通过直通方式上载,不进行SQL解析。
    命令为:
    sqlldr dbuser/oracle control=emp.ctl log=emp.log direct=true
    4.2        exp
    参见dmp/exp_demo.sh。
    将数据库内的各对象以二进制方式下载成dmp文件,方便数据迁移。
    buffer:下载数据缓冲区,以字节为单位,缺省依赖操作系统
    consistent:下载期间所涉及的数据保持read only,缺省为n
    direct:使用直通方式        ,缺省为n
    feeback:显示处理记录条数,缺省为0,即不显示
    file:输出文件,缺省为expdat.dmp
    filesize:输出文件大小,缺省为操作系统最大值
    indexes:是否下载索引,缺省为n,这是指索引的定义而非数据,exp不下载索引数据
    log:log文件,缺省为无,在标准输出显示
    owner:指明下载的用户名
    query:选择记录的一个子集
    rows:是否下载表记录
    tables:输出的表名列表
      

  2.   

    看着有点迷糊,呵呵,不过好像我就是没有声明上传字段的类型,这么写可以吗?
    LOAD DATA
    INFILE  'd:\ss.txt'
    INSERT INTO TABLE CABINT.USERS
    FIELDS TERMINATED BY "|"
    (name char(20),    //我数据库的字段设的是varchar2(20)
    sex char(2),
    age integer external) //我数据库的字段设的是number//执行cmd的那个命令以后,没有反应,请问我问题出在哪里到底?
    是我少执行了什么命令吗
      

  3.   

    LOAD DATA
    INFILE 'd:\ss.txt'
    INSERT INTO TABLE CABINT.USERS
    FIELDS TERMINATED BY "|" optionally enclosed by "
    (name char(20), //我数据库的字段设的是varchar2(20)
    sex char(2),
    age integer external) //我数据库的字段设的是number这样试一试
      

  4.   

    哦,好的,另外还有一个问题,就是如果我的表不为空的话,当我第2天再调用这个ctl文件的时候,就会提示我此表不为空,不可用insert语句,该怎么解决呢?这块不是很熟,麻烦各位大大了
      

  5.   

    刚又仔细看了下您的东西,发现刚才您已经说了怎么解决了insert问题了,怪我没注意,呵呵,谢谢了。现在客户给的格式是:
    张三,22,男|李四,23,女|王五,24,男|赵六,25,女fields terminated by ‘|’,光这个好像不够了把?