现在的情况是每个月要把300多M的txt数据导入到oracle中
现在用sql loader导入时提示
SQL*Loader-510: Physical record in data file (if03.txt) is longer than the maximum(1048576)
SQL*Loader-2026: the load was aborted because SQL Loader cannot continue.
可能是数据量太大么?
现在从客户的角度出发,就算能导入操作起来也不方便,请各位大侠能提供点代码,从程序中读入数据 并导入到相应的表中么?
请大家给出详细代码  谢谢了

解决方案 »

  1.   

    顺便说一下  文件有20多个列,如果一行一行读再分解好像有点麻烦,
    还有字段间是用tab分割的
      

  2.   

    现在我把数据能读入到程序中 也能分开每个字段,但是我怕几十万(最少)个insert语句执行的时候是不是会有点问题啊?会不会死掉啊,我一会就试一试。
    看看各位高手有好的办法么?
      

  3.   


    简单说就是把一个固定格式的大文件内容存入oracle一个表的相应字段中?
    如果是,觉得效率低的话,用Pro*C做吧.
      

  4.   

    楼上  Pro*C 是什么 能说的详细点么  没用过
      

  5.   

    楼主试验试验SqlBulkCopy类。 这个类是。net 2.0中的。专用于大批量的数据迁移。你可以看看。 祝福你。
      

  6.   

    可以循环读取文件的每一行,解析成相应的字段(根据分隔符),然后Insert到数据库中就行了啊
      

  7.   

    也就是C语言,里边加了点自己的头文件。自定义了一些关键字。
    最少安装Oracle Client都安装了Pro*C/C++程序。通过这个程序可以编译成一个标准的PE文件.
      

  8.   

    以前写的向oracle数据库里倒入word文件的,把文件转化成btye[],然后再存进数据库。
      

  9.   

    把文件转换成btye[],是要好些.
    估计也快不到那去呀
      

  10.   

    才300多M...大数据类型都支持的...例...OracleConnection connection = new OracleConnection("...");//连接串
    connection.Open();
    OracleTransaction transaction = connection.BeginTransaction();
    OracleCommand command = connection.CreateCommand();
    command.Transaction = transaction;//注意!一定要用事务
    command.CommandText = "...";//SQL语句
    command.Parameters.Add(new OracleParameter("tempblob", OracleType.Blob)).Direction = ParameterDirection.Output;//设置参数
    command.ExecuteNonQuery();
    OracleLob tempLob = (OracleLob)command.Parameters[0].Value;//声明大数据类型
    byte[] tempbuff = new byte[10000];//开缓冲区
    tempLob.BeginBatch(OracleLobOpenMode.ReadWrite);//一定要用批处理
    tempLob.Write(tempbuff,0,tempbuff.Length);
    tempLob.EndBatch();
    transaction.Commit();上面的例子是用System.Data.OracleClient...你也可以用效率更高的OracleAccess,用法查Oracle官方文档...
      

  11.   

    楼上的 我那300多M的数据是一个表,20多个字段
    我是想把表导入的oracle数据库相应的表中
    你写的我不是很懂  能像我说的情况举个例子么
      

  12.   

    楼上的 我那300多M的数据是一个表,20多个字段
    我是想把表导入的oracle数据库相应的表中
    你写的我不是很懂 能像我说的情况举个例子么
    ----------------
    这个意思啊...那和大数据无关了...是数据导入的问题了...自己写个工具做...基本上就是解析文件->构造数据集->更新...或者...为txt建立一个OBDC数据源...再用工具更新...
      

  13.   

    这个和文件大小没有什么直接的关系,就是解析你的数据到一个固定的数据结构,然后倒入到数据库内;
    300m的一个text文件考虑分批处理,你要把你这个txt文件分成多个文件;这个没有处理过
      

  14.   

    我在客户端读了5000条存入到oracle库中了,大约用了20秒吧 
    几十万条能在服务器上读出来么?
      

  15.   

    没有用过oracle 顶给分吗,顶.........
      

  16.   

    推荐一个思路在sybase  下 ,只要数据文件遵循一定的格式 , 就能用 bcp 工具 (bulk copy ..) 导入bcp in -Usa -Sserver -Ppassword file  database.table非常之快在oracle下,也有 数据导入导出imp/exp你可以研究一下
      

  17.   

    我以前遇到过类似的情况,每天2个文件共1.2G,用BCP工具导入的。自己也写过但导入速度不理想,所以最后放弃了。
      

  18.   

    装oracle 10g,使用odp.net;使用xmltype数据类型:
    建表:
    CREATE TABLE resumes (
    employee_id NUMBER(6) PRIMARY KEY,
    resume XMLType)
    XMLType COLUMN resume
    STORE AS CLOB;c#代码:
    using Oracle.DataAccess.Types;
    using Oracle.DataAccess.Client;第一步:将xml文件读成string型:
    StreamReader sr = new StreamReader("E:\\my.net\\oracleXmlTest\\mcc.xml");
      string outstring = ""; 
                    // Read and display lines from the file until the end of 
                    // the file is reached.
                 while ((line = sr.ReadLine()) != null)
                 {
                     outstring += line;
                 }
    或者直接:
      XmlDocument xDocument = new XmlDocument();
      xDocument.Load("E:\\my.net\\oracleXmlTest\\mcc.xml");
    第二步:定义OracleXmlType
         // OracleXmlType cxml = new OracleXmlType(conn, outstring);
           OracleXmlType cxml = new OracleXmlType(conn, xDocument);
    第三步:
     OracleConnection conn = new OracleConnection("Data Source=GISORA;User Id=meng;Password=meng");
    conn.Open();
     OracleCommand cmd = new OracleCommand();
     cmd.Connection = conn;
     cmd.CommandText = "INSERT INTO resumes VALUES (15,:pb)";
     cmd.Parameters.Add("pb", OracleDbType.XmlType, iSize).Value = cxml;
     cmd.ExecuteNonQuery();            
     conn.Close();
      

  19.   

    感谢 sunmcc428()   我试一试
    朋友们还有好方法么?
      

  20.   

    to sunmcc428() 
    我是有库结构的  我只是想把相应的字段导入到表中对应的字段中
    你这个方法可能不行吧
      

  21.   

    TO  liuhszh()
    bcp好像不能导入到oracle中吧
      

  22.   

    你的存储字段类型是什么?clob,blob,?
      

  23.   

    应该是clob吧  nvarchar 和number类型的  大家帮忙 啊
    有用过sqlloader的么???
      

  24.   

    应该分块处理。
    楼上那个事务有点晕,
    如果一个数据出错,300多M 全部事务RollBack..
    我估计要导个几百次,每次花个10分钟吧。
      

  25.   

    up..帮你顶顶。。这个最好找orcal的DBA问一下。比较好。。
      

  26.   

    ni ke yi  ba wen jian du ru dao yi ge dataset zhong ran hou ti jiao geng xin dao shu ju ku .
      

  27.   

    xiexie lou shang de l  mang fan ni da na me duo zi mu le
      

  28.   

    Oracle 中不是有大数据类型吗?
    blob  什么clob,
    如果我没有记错的话应该是可以存几个G没有问题!
      

  29.   

    昨天用的ipod的浏览器,不能输入中文,第一个回帖是不小心发的,麻烦管理员删除。
      

  30.   

    我只在SQL Server中导入过大量的数据.用的是BCP.思路是先在数据库中建好一个对应的表,并生成对应的格式化文件,再用BCP导入(指定格式化文件),速度很快.Oracle中应该也有这种实用的工具,你查下帮助.
      

  31.   

    大家还有好办法么?有谁知道oracle的导入工具么
      

  32.   

    你用BLOB或者CLOB才可以导入300M大的文本大于4000字节就要用LOB的
      

  33.   

    非要用C#么,如果用OCI,可以用这个办法
    http://download-east.oracle.com/docs/cd/B19306_01/appdev.102/b14250/oci05bnd.htm#sthref805
      

  34.   

    楼主试试DataTable (SerializationInfo, SerializationInfo) 直接解析txt文本数据,然后DataTable.BeginLoadData()、DataTable.EndLoadData()进行异步加载数据
    关键是SerializationInfo和SerializationInfo,我也不是很熟,你可以看看msdn,帮你找了相关资料:
    ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.NETDEVFX.v20.chs/cpref11/html/T_System_Runtime_Serialization_SerializationInfo.htm
    ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.NETDEVFX.v20.chs/cpref11/html/T_System_Runtime_Serialization_StreamingContext.htm
      

  35.   

    to maco_wang 
    的确是这个问题  已经发现了  但还是很感谢  
    感谢大家了