Oracle SQLLDR 实用程序无响应

Oracle SQLLDR utility no response

我有一个 java 应用程序,它使用 Oracle SQLLDR 实用程序将 CSV 文件数据上传到 oracle 数据库。

有时,SQLLDR 实用程序不提供 return/response 代码,而我们可以看到 Index 在 table 中被禁用(这确保调用了 SQLLDR 实用程序)而且我在服务器中使用了 TOP 命令来查找是否有任何SQLLDR进程是运行,但是没有这样的进程。

此外,DBA 确认,数据库上没有与 SQLLDR 操作相关的活动会话。

oracle table 级别有什么需要检查的吗? 请告诉我前进的方向。

SQL

 connect scott/tiger;
 create table employee
(
  id integer,
  name varchar2(10),
  dept varchar2(15),
  salary integer,
  hiredon date
)

控制文件

load data
 infile '/home/db1212/x.txt'
 into table employee
 fields terminated by ","
 ( id, name, dept, salary )

x.txt

200,Jason,Technology,5500
300,Mayla,Technology,7000
400,Nisha,Marketing,9500
500,Randy,Technology,6000
501,Ritu,Accounting,5400

执行

$ sqlldr scott/tiger control=/home/db1212/x.ctl

returns

SQL*Loader: Release 12.1.0.2.0 - Production on Sat Oct 17 21:23:47 2020

Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

Path used:      Conventional
Commit point reached - logical record count 5

Table EMPLOYEE:
  5 Rows successfully loaded.

Check the log file:
  x.log
for more information about the load.

执行第二次产生错误

$ sqlldr scott/tiger control=/home/db1212/x.ctl

returns

SQL*Loader: Release 12.1.0.2.0 - Production on Sat Oct 17 21:25:39 2020

Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

Path used:      Conventional
SQL*Loader-601: For INSERT option, table must be empty.  Error on table EMPLOYEE

T运行cate table in SQL*加上

truncate table employee;

从内部使用以下 Java class

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class t1 {

    public static void main(String[] args) {

        t1 obj = new t1();

        String output = obj.executeCommand();

        System.out.println(output);

    }

    private String executeCommand() {

        StringBuffer output = new StringBuffer();

        try {

            Process p = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", "sqlldr scott/tiger control=/home/db1212/x.ctl"});
            p.waitFor();
            BufferedReader reader
                    = new BufferedReader(new InputStreamReader(p.getInputStream()));

            String line = "";
            System.out.println("Return code:"+p.exitValue()+"\n"); 
            while ((line = reader.readLine()) != null) {
                output.append(line + "\n");
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        return output.toString();

    }

}

构建并运行t1.java

$ javac t1.java 
$ java t1

returns

Return code:0


SQL*Loader: Release 12.1.0.2.0 - Production on Sat Oct 17 21:30:31 2020

Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

Path used:      Conventional
Commit point reached - logical record count 5

Table EMPLOYEE:
5 Rows successfully loaded.

Check the log file:
x.log
for more information about the load.

正在执行第二次模拟错误

$ java t1

returns

Return code:1


SQL*Loader: Release 12.1.0.2.0 - Production on Sat Oct 17 21:30:39 2020

Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

Path used:      Conventional

t运行再次 table

truncate table employee;

并更改输入文件 x.txt

200,Jason,Technology,5500
300,Mayla,Technology,7000
400,Nisha,MarketingAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,9500
500,Randy,Technology,6000
A501,Ritu,Accounting,5400 

执行死刑

$ java t1

以下输出

Return code:2


SQL*Loader: Release 12.1.0.2.0 - Production on Sat Oct 17 21:47:05 2020

Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

Path used:      Conventional
Commit point reached - logical record count 5

Table EMPLOYEE:
  3 Rows successfully loaded.

Check the log file:
  x.log
for more information about the load.

这意味着:

所以如果

  • 执行成功EX_SUCC=0
  • 常规 SQL加载程序错误,如“SQLLoader-601:对于 INSERT 选项,table 必须为空。错误 table EMPLOYEE" i.e.unsuccesful 执行或参数给出 EX_FAIL = 1 (Unix, Windows returns 3)
  • 成功执行/加载,但出现 SQL 错误,例如“ORA-12899:列“SCOTT”的值太大。“EMPLOYEE”。“DEPT”(实际:44,最大值:15)”returns EX_WARN = 2

不幸的是文档说明

SQLLoader returns any exit code other than zero, you should consult your system log files and SQLLoader log files for more detailed diagnostic information.

这意味着没有办法直接将错误作为 stderr、管道等获取,如果 EX_FAIL 或 EX_WARN,您必须验证写入的日志文件。