【发布时间】:2014-06-02 18:01:00
【问题描述】:
我有以下外部表的 DDL。
CREATE TABLE emp_load
(
employee_number VARCHAR2(50),
employee_last_name VARCHAR2(50),
employee_first_name VARCHAR2(50),
employee_middle_name VARCHAR2(50),
employee_hire_date VARCHAR2(50)
)
organization external (TYPE oracle_loader DEFAULT directory abc_dir ACCESS
parameters ( records
delimited BY newline fields terminated BY '|' missing
field VALUES are NULL (employee_number, employee_last_name
, employee_first_name, employee_middle_name,
employee_hire_date) ) location ('info.dat') ) reject limit
UNLIMITED
我的 .dat 文件如下所示。
010|ABC|DEF|XYZ|03-DEC-2011
020|CCC|123|SSS|04-DEC-2011
我有一张桌子叫
CREATE TABLE test_emp_load_1
(
mployee_number VARCHAR2(50),
employee_last_name VARCHAR2(50),
employee_first_name NUMBER(38),
employee_middle_name VARCHAR2(50),
employee_hire_date VARCHAR2(50)
)
现在我正在使用下面的合并语句(在下面,即使我保留 e.EMPLOYEE_NUMBER = '020' 我认为首先它会尝试对整个外部表运行扫描)
这给出了以下错误。
SQL 错误:ORA-29913:执行 ODCIEXTTABLEFETCH 调出时出错 ORA-01722: 无效号码
但是当我使用时
MERGE INTO test_emp_load_1 te
USING (select * from emp_load where EMPLOYEE_NUMBER = '020') e
on ( e.EMPLOYEE_FIRST_NAME = te.employee_first_name )
WHEN MATCHED THEN
UPDATE SET
te.employee_last_name = e.EMPLOYEE_LAST_NAME
WHEN NOT MATCHED THEN
INSERT
(te.employee_last_name)
VALUES
( e.EMPLOYEE_LAST_NAME)
where e.EMPLOYEE_NUMBER = '020';
我正在合并输出 1 行。它看起来是 Oracle 11g R2 中的一个错误。
我在 Windows 平台上使用 DB Oracle 11G R2。我也在 Red hat Linux 和 Oracle 11g R2 中尝试过这个我遇到了同样的问题
有什么建议吗?
【问题讨论】:
-
好吧,为什么你的名字定义为:employee_first_name number(38)?
-
与您的问题无关;但同样如此;为什么将 EMPLOYEE_NUMBER 声明为 VARCHAR2(50)?而且,您还有一个 MLOYEE_NUMBER,这将是您的下一个错误...
-
我有两个表,一个是 varchar,另一个是第一对应 010,另一个对应 020
-
这仍然没有任何意义,但问题出在
emoloyee_first_name字段,而不是employee_number。再次查看您的示例数据。您有一行,第三个字段为DEF,您尝试在合并的on子句中将其与number(38)进行比较。你得到了一个完全合理的错误,没有看到错误。