ORA-01722:无效号码 ORA-06512:在“BWSTAGE.LOAD_CONTACT_PROCEDURE”,第 8 行 ORA-06512:在第 2 行

Posted

技术标签:

【中文标题】ORA-01722:无效号码 ORA-06512:在“BWSTAGE.LOAD_CONTACT_PROCEDURE”,第 8 行 ORA-06512:在第 2 行【英文标题】:ORA-01722: invalid number ORA-06512: at "BWSTAGE.LOAD_CONTACT_PROCEDURE", line 8 ORA-06512: at line 2 【发布时间】:2017-11-22 07:22:17 【问题描述】:
CREATE OR REPLACE PROCEDURE LOAD_CONTACT_PROCEDURE AS

CURSOR C1 IS SELECT FIRST_NAME, MIDDLE_INITIAL, LAST_NAME, TITLE, DATE_OF_BIRTH, PHONE_MOBILE, PREFERRED_PHONE, EMAIL_ADDRESS, PREFERRED_EMAIL, DECEASED, 
preferred_name, student_id, last_website_login, north_america_email, international_email, afloat_email, lifelong_quarterly, fundraising_email, id_first_name, 
id_middle_name, id_last_name, id_number, passport_first_name, passport_middle_name, passport_last_nm, passport_number, passport_issuing_auth, passport_date_issued, 
passport_expiration_dt, state_of_birth, special_needs_descr, whitelist_descr FROM STAGE_CONTACT;

BEGIN

FOR i IN C1 LOOP

INSERT INTO LOAD_CONTACT(FIRSTNAME, MIDDLENAME, LASTNAME, TITLE, BIRTHDATE, PHONE, NPE01__PREFERREDPHONE__C, NPE01__HOMEEMAIL__C, NPE01__PREFERRED_EMAIL__C,
NPSP__DECEASED__C, PREFERRED_NAME__C, STUDENT_ID__C, LAST_WEBSITE_LOGIN__C, NORTH_AMERICA_EMAIL__C, INTERNATIONAL_EMAIL__C, AFLOAT_EMAIL__C, LIFELONG_QUARTERLY__C,
FUNDRAISING_EMAIL__C, ID_FIRST_NAME__C, ID_MIDDLE_NAME__C, ID_LAST_NAME__C, ID_NUMBER__C, PASSPORT_FIRST_NAME__C, PASSPORT_MIDDLE_NAME__C, PASSPORT_LAST_NAME__C, 
PASSPORT_NUMBER__C, PASSPORT_ISSUING_AUTHORITY__C, PASSPORT_DATE_ISSUED__C, PASSPORT_EXPIRATION_DATE__C, STATE_OF_BIRTH__C, SPECIAL_NEEDS_DESCRIPTION__C, 
WHITELIST_DESCRIPTION__C) 

VALUES 

(i.FIRST_NAME, i.MIDDLE_INITIAL, i.LAST_NAME, i.TITLE, i.DATE_OF_BIRTH, i.PHONE_MOBILE, 'Home', i.EMAIL_ADDRESS, 'Personal',
DECODE (i.DECEASED, 'Y', '1', 'N', '0'), i.preferred_name, i.student_id, i.last_website_login, DECODE (i.north_america_email, 'Y', '1', 'N', '0'), 
DECODE (i.international_email, 'Y', '1', 'N', '0'), DECODE (i.afloat_email, 'Y', '1', 'N', '0'), DECODE (i.lifelong_quarterly, 'Y', '1', 'N', '0'),
DECODE (i.fundraising_email, 'Y', '1', 'N', '0'), i.id_first_name, i.id_middle_name, i.id_last_name, i.id_number, i.passport_first_name, i.passport_middle_name, 
i.passport_last_nm, i.passport_number, i.passport_issuing_auth, i.passport_date_issued, i.passport_expiration_dt, i.state_of_birth, i.special_needs_descr,
i.whitelist_descr);

END LOOP;

COMMIT;

END LOAD_CONTACT_PROCEDURE;

我正在编写此程序,但出现以下错误:

ORA-01722:无效号码 ORA-06512:在 “BWSTAGE.LOAD_CONTACT_PROCEDURE”,第 8 行 ORA-06512:第 2 行

很久以来我一直在尝试解决它,但我无法找到解决方案。请帮忙。

【问题讨论】:

当其他人在插入循环中添加异常并调试错误记录的变量I.first_name 发布表LOAD_CONTACT的DDL 我认为 INSERT .. SELECT .. (带有子查询)更好。如果您正在处理数百万行,也可以使用 BULK... student_id的数据类型在stage_contact中为varchar(15),在load_contact中为Number(18,0)。当我从当前脚本中排除此列时,它被执行了。 请检查并匹配您的暂存表和其他表的列数据类型。可能存在一些数据类型不匹配的问题。将字符串转换为数字会产生此问题。例如,在临时表中,Amount 可能在 Varchar 中,值为 -100.90,并且您尝试将字段为“Amount”的字段插入到当前表中,该字段为 Number 数据类型。这将导致 -1722 。请检查要插入的所有字段的数据类型。我会要求您添加批量收集选项并尝试运行代码。 【参考方案1】:

ORA-01722: invalid number 表示您正在尝试将非数字值放入数字列中。因此,您需要检查在 INSERT 投影中引用的 LOAD_CONTACT 中的所有列,并将它们与 VALUES 子句中的列进行比较。

有两种可能:

    两个投影不同步,您需要重新排序一个以匹配另一个。 STAGE_CONTACT 将字符串列用于数字属性。这在临时表中并不罕见。但它确实留下了暂存表包含无法转换为数字的字符串的可能性。这更难捕捉。

但是你可以进行一些粗略的错误处理:

FOR i IN C1 LOOP
   begin
     INSERT INTO LOAD_CONTACT(FIRSTNAME, MIDDLENAME, LASTNAME, TITLE, BIRTHDATE, PHONE, NPE01__PREFERREDPHONE__C, NPE01__HOMEEMAIL__C, NPE01__PREFERRED_EMAIL__C,
NPSP__DECEASED__C, PREFERRED_NAME__C, STUDENT_ID__C, LAST_WEBSITE_LOGIN__C, NORTH_AMERICA_EMAIL__C, INTERNATIONAL_EMAIL__C, AFLOAT_EMAIL__C, LIFELONG_QUARTERLY__C,
FUNDRAISING_EMAIL__C, ID_FIRST_NAME__C, ID_MIDDLE_NAME__C, ID_LAST_NAME__C, ID_NUMBER__C, PASSPORT_FIRST_NAME__C, PASSPORT_MIDDLE_NAME__C, PASSPORT_LAST_NAME__C, 
PASSPORT_NUMBER__C, PASSPORT_ISSUING_AUTHORITY__C, PASSPORT_DATE_ISSUED__C, PASSPORT_EXPIRATION_DATE__C, STATE_OF_BIRTH__C, SPECIAL_NEEDS_DESCRIPTION__C, 
WHITELIST_DESCRIPTION__C) 

    VALUES 

    (i.FIRST_NAME, i.MIDDLE_INITIAL, i.LAST_NAME, i.TITLE, i.DATE_OF_BIRTH, i.PHONE_MOBILE, 'Home', i.EMAIL_ADDRESS, 'Personal',
DECODE (i.DECEASED, 'Y', '1', 'N', '0'), i.preferred_name, i.student_id, i.last_website_login, DECODE (i.north_america_email, 'Y', '1', 'N', '0'), 
DECODE (i.international_email, 'Y', '1', 'N', '0'), DECODE (i.afloat_email, 'Y', '1', 'N', '0'), DECODE (i.lifelong_quarterly, 'Y', '1', 'N', '0'),
DECODE (i.fundraising_email, 'Y', '1', 'N', '0'), i.id_first_name, i.id_middle_name, i.id_last_name, i.id_number, i.passport_first_name, i.passport_middle_name, 
i.passport_last_nm, i.passport_number, i.passport_issuing_auth, i.passport_date_issued, i.passport_expiration_dt, i.state_of_birth, i.special_needs_descr,
i.whitelist_descr);

 exception
    when invalid_number then
        raise_application_error(-20000, 
             'record for ' ||i.FIRST_NAME||' '||i.MIDDLE_INITIAL||' '||i.LAST_NAME 
       || ' contains invalid number',
            true);
  end;
END LOOP;

这将为您提供一些信息,您可以使用这些信息来查询 STAGE_CONTACT 并查找恶意值。

如果您是针对真实系统(而不是家庭作业)执行此操作,则应调查 Oracle 的批量 DML 错误日志记录。 Find out more.

【讨论】:

没有 cmets 的两次否决?我想知道这个答案有什么引起争议的?【参考方案2】:

我在我的 sql 代码中遇到了同样的问题并解决了。问题是,我的值类型和表列的类型不匹配。例如,我尝试将 varchar 值插入 varchar2 列。也许它可以帮助你。

【讨论】:

以上是关于ORA-01722:无效号码 ORA-06512:在“BWSTAGE.LOAD_CONTACT_PROCEDURE”,第 8 行 ORA-06512:在第 2 行的主要内容,如果未能解决你的问题,请参考以下文章

SQL 错误:ORA-01722:无效号码

SQL ORA-01722: 无效号码

SELECT FROM AS 导致 ORA-01722: 无效号码

如何修复 oracle ORA-01722 无效号码错误

ORA-01722: 使用 to_number 时号码无效

ORA-01722: 无效的包编号