在ORACLE中TAB表中结构:
A INT ,
B nvarchar2(50)
我在D:\DATA.TXT中有大量数据,格式与TAB表相同,现我想将TXT文件导入到TAB表中,
实现这种批处理的方法,我在SQL2000中用:
 BULK   INSERT   事件记录表 FROM   'D:\DATA.TXT‘
  WITH   (   
        DATAFILETYPE   =   'char',   
        FIELDTERMINATOR   =   ',',   
        ROWTERMINATOR   =   '\n'   
  )
而在ORACLE中使用这种方法却已不行了,请问ORACLE用什么方法来处理批量数据的插入。

解决方案 »

  1.   

    SQL*LOADER是oracle的数据加载工具,在NT下sql*loader的命令为SQLLDR,在UNIX下一般为SQLLDR/SQLLOAD。通常用来将操作系统文件迁移到oracle数据库中。它是大型数据仓库选择使用的加载方法,因为它提供了最快速的途径(direct,parallel)。但这种方法要求存储数据的oracle表是已经存在的。
    使用这种方法导入excel内容到oracle时,首先需要将excel文件另存为文本格式,文件类型选文本类型或者csv类型即将e:\test.xls另存为e:\test.csv。
    如果oracle没有对应存储数据的表结构,则需要创建表test(id,name,telphone)。
    用记事本创建sql*loader控制文件test.ctl(ctl后缀是企图证明这是一个控制文件,但实际上这个文件后缀不重要,用户可以自由选择,但文件格式一定要是文本格式),内容如下:
    Load data
    Infile ‘e:\test.csv’          --数据源文件名称
    Append|insert|replace       --append在表后追加,insert插入空表,replace替代原有内容
    Into table test            --要导入的数据库表名称
    [when id = id_memo]     --过滤条件
    Fields terminated by X’09’ --字段分隔符
    (id,name,telphone)        --字段名称列表
    最后在命令窗口输入sqlldr命令行执行导入操作Sqlldr userid = system/manager control=’e:\test.ctl’
    Sqlldr的函数关键字说明:
    Userid   --oracle用户名 userid = username/password
    Control --控制文件名称 control = ‘e:\insert.ctl’
    Log     –-日志文件名称 log = ‘e:\insert.log’
    Bad     --损坏文件名称
    Data     --data file name
    Discard    --discard file name
    Discardmax --number of discards to allow(默认全部)
    Skip       --导入时跳过的记录行数(默认0)
    Load       --导入时导入的记录行数(默认全部)
    Errors    --允许错误的记录行数(默认50)
      

  2.   


    1. 用Toad 直接导入execl等类型的数据2. 用sqlloader 工具导入数据.. SQL LOADER 实例 创建表:test_load, 
    sql>create table test_load(id number(10),uname varchar2(20), phone varchar2(20)); 
    控制文件:d:\loader.ctl 
    load data 
    infile 'd:\datafile.txt' 
    append into table test_load 
    fields terminated by "," optionally enclosed by '"' 
    ( id, uname, phone ) 数据文件:D:\datafile.txt 
    001,"david",0551-1234567 
    002,"dave",0551-7654311 
    sqlloader命令: 
    SQL>sqlldr 'sys/admin AS SYSDBA' control=D:\loader.ctl log=d:\a.log 
    SQL*Loader: Release 10.2.0.1.0 - Production on 星期四 7月 2 09:40:42 2009 
    Copyright (c) 1982, 2005, Oracle.  All rights reserved. 
    达到提交点 - 逻辑记录计数 1 
    达到提交点 - 逻辑记录计数 2 
    SQL> select * from test2; 
         EMPNO ENAME             SAL     DEPTNO 
    ---------- ---------- ---------- ---------- 
         10002 Frank             500         20 
         10001 Scott            1000         40 
    Oracle SQL Loader
    http://blog.csdn.net/tianlesoftware/archive/2009/10/16/4674063.aspx
    ------------------------------------------------------------------------------
    Blog: http://blog.csdn.net/tianlesoftware
    网上资源: http://tianlesoftware.download.csdn.net
    相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx
    Q Q 群:62697716 
      

  3.   

    用SQL*LOADER...
    首先要写个CTL文件,
     result.ctl内容:
    load data
    infile 'D:\DATA.TXT'
    into table TAB 
    (col1 char terminated by ',',
    col2 char terminated by ',',
    col3 char terminated by ',',
    col4 char terminated by whitespace)
    说明:
      infile 指数据源文件 这里我们省略了默认的 
      into table tab 默认是INSERT,也可以into table tab APPEND为追加方式,或REPLACE
      terminated by ',' 指用逗号分隔
      terminated by whitespace 结尾以空白分隔
        col1...col4是填表中具体的列名,如id,name,age...有多少列,自己加上。
    最后在装了数据库的机器上的命令提示符窗口执行(如WINDOWS的DOS窗口):
    sqlldr userid=fancy/testpass control=result.ctl log=resulthis.out
    说明:userid=fancy/testpass 是登陆数据库的用户名/密码 ,control=result.ctl 就是刚才上面写的CTL文件,写绝对路径不会有问题。log这一项是日志,就这样就行。
    当加载大量数据时(大约超过10GB),最好抑制日志的产生:
      SQL>ALTER TABLE RESULTXT nologging;
      

  4.   

    把数据放在excel 中 直接用sqlserver 企业管理器就能直接导入打开企业管理器  右击库 导入数据  选择目标库再选择导入execl应用程序  指定文件导入  OK
      

  5.   

    大哥,人家问的是oracle,认真看帖也是一种负责任的态度
      

  6.   

    1.sqlplus username/password@sid
    2.在数据库中建立好需要导入的数据表结构
    3.手动保存input.ctl文件
    load data
    infile 'test.txt'
    append into table system.lin--追加记录
    filelds teminated by X'09'
    4.sqlldr userid=system/manager@sid control=input.ctl
      

  7.   

    sqlldr 语句时为何报无效语句 我的数据库版本是ORACLE10g 
      

  8.   

    sqlldr 语句不能先登陆SQLPLUS再执行的如果是WINDOWS下,在运行中执行:CMD,然后在弹出窗口内直接执行。LIUNX下直接在安装数据库的用户下执行。
      

  9.   

    sqlldr性能非常好,建议用此方式导入。
      

  10.   

    sql2000可以这样用,而Oracle只能用sqlldr命令批量导入数据,楼上很多都讲解了,你试试,肯定能行。
      

  11.   


    create or replace directory DATA_PATH as 'D:\';create table tab_exp
    (
        a  number,
        b  varchar2(20)
    )
    organization external
    (
        type oracle_loader
        default directory  DATA_PATH
        access parameters
        (
            records delimited by newline
            badfile  'D:\data_badfile.txt'
            logfile  'D:\data_logfile.txt'
            fields terminated by  ','
            missing field values are null
            (a, b)
        )
        location('DATA.TXT')
    );select * from tab_exp;
      

  12.   

    用SQL*LOADER... 
    首先要写个CTL文件, 
    result.ctl内容: 
    load data 
    infile 'D:\DATA.TXT' 
    into table TAB 
    (col1 char terminated by ',', 
    col2 char terminated by ',', 
    col3 char terminated by ',', 
    col4 char terminated by whitespace) 
    说明: 
      infile 指数据源文件 这里我们省略了默认的  
      into table tab 默认是INSERT,也可以into table tab APPEND为追加方式,或REPLACE 
      terminated by ',' 指用逗号分隔 
      terminated by whitespace 结尾以空白分隔 
        col1...col4是填表中具体的列名,如id,name,age...有多少列,自己加上。 
    最后在装了数据库的机器上的命令提示符窗口执行(如WINDOWS的DOS窗口): 
    sqlldr userid=fancy/testpass control=result.ctl log=resulthis.out 
    说明:userid=fancy/testpass 是登陆数据库的用户名/密码 ,control=result.ctl 就是刚才上面写的CTL文件,写绝对路径不会有问题。log这一项是日志,就这样就行。 
    当加载大量数据时(大约超过10GB),最好抑制日志的产生: 
      SQL>ALTER TABLE RESULTXT nologging;