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,您必须验证写入的日志文件。
我有一个 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,您必须验证写入的日志文件。