option(errors=0)
LOAD DATA
INFILE "C:\CTLTEST\TEST.TXT"
TRUNCATE

INTO TABLE test.TABLE1
FIELDS TERMINATED BY ","
(ID,NAME,AGE) ****ID CHAR(5) NAME CHAR(10) AGE NUMBER(3)****
以上的代码我有2个问题想请问一下大家。
1.如果我现在要插入10条记录。但是第二条记录的AGE值是99999超出长度了。我认为这时SQLLOADER的ERRORS数应该等于1并且SQLLOADER终止了。但是我怎么才能够拿到这个ERRORS的值?因为我下面的程序需要判断SQLLOADER有没有出错来进行其他的处理。
2.如果我要插入的目标表中的字段有200个。那么有没有什么办法可以像用 INSERT INTO TABLE1 (SELECT * FROM TABLE2) 那样不用列出全部的字段名?

解决方案 »

  1.   

    1.sqlloader做完后"再插入10条记录",不行吗?2.可以。
    INSERT INTO TABLE1 as SELECT * FROM TABLE2;
      

  2.   

    我理解错了,原以为sqlloader只能整库导入,其实它还能以into table resultxt APPEND方式追加记录。  :-)不知道下面的贴子对你有没有帮助?特别是第三.四步骤:http://blog.163.com/mazelmiler@126/blog/static/52740811200861015845815/
      

  3.   

    1: 如果有错误, LOG文件里面会有ORA字符出现的,在UNIX环境下可以使用命令: grep -i "ORA", 通过这个判断就行.
    2: 可以查数据字典来找出表中所有的列:
    SELECT COLUMN_NAME || ','
      FROM ALL_TAB_COLUMNS
     WHERE OWNER = UPPER('SCHEMA_NAME')
       AND TABLE_NAME = UPPER('TABLE_NAME');
    然后再拷贝到control文件中便可.
      

  4.   

    1.SQLLOADER 可以设置允许出错的语句,比如10条,超过10条才会停止。并不是一条错了,就会终止的,查错误可以用楼上的方法。2、貌似一定要把列名写出来的,可以用楼上的方法,查出来在拷贝。把列名写出来也比较的安全。
      

  5.   

    1.指定bad=bad.txt参数,然后分析bad.txt文件,通过查找关键字找到出错记录数。
    2.不可以,必须依次指定.
      

  6.   

    感谢大家的回答。
    我目前对于SQLLOADER出错的判断是想用bad.txt这个文件的大小来判断。如果在执行好第一个SQLLOADER之后bad.txt的文件大小是0KB的话。那么我就认为SQLLOADER在刚才的执行过程中是全部正确的。如果大于OKB。那么就让下面的程序终止运行。不知道这个方法可以不可以?
    其实我还是希望能够通过一个方法去得到ERRORS的值。因为这样做对我程序来说是最方便的了。(比如 if sqlloader.errors >0 then .....)毕竟要是生成bad.txt文件的话。最后我还必须要做一步删除的操作。PS:我现在的预想的程序结构是这样的,烦请大家帮忙参考下是否可行。谢谢。FUNCTION{
    SQLLOADER1  --执行。
    if  bad.txt > 0KB THEN    bad.txt  --文件大小判断,大于0KB程序退出
      EXIT FUNCTION
    END IF
    SQLLOADER2  --执行。
    if  bad.txt > 0KB THEN    bad.txt  --文件大小判断,大于0KB程序退出
      EXIT FUNCTION
    END IF
    SQLLOADER3  --执行。
    if  bad.txt > 0KB THEN    bad.txt  --文件大小判断,大于0KB程序退出
      EXIT FUNCTION
    END IFBEGIN   --事务开始SQL语句执行,出错的话回滚。commit  --提交事务
    }另外,再请教一下各位。在VB.NET中用什么方法可以直接调用CTL这个文件?我之前做的SQLLOADER的实验都是在CMD中直接打COMMAND命令语句完成的。在VB.NET中还没尝试过。
      

  7.   

    2.如果我要插入的目标表中的字段有200个。那么有没有什么办法可以像用 INSERT INTO TABLE1 (SELECT * FROM TABLE2) 那样不用列出全部的字段名?
    ============================================================================================
    需要列出字段名。还是看错了,原以为是这方面的问题:create table tabcopy1 as (select * from tabcopy where 1=0);