Oracle ORA-01722:无效号码ORA-06512:at";B阶段.加载“接触”程序;,第8行ORA-06512:第2行

Oracle ORA-01722:无效号码ORA-06512:at";B阶段.加载“接触”程序;,第8行ORA-06512:第2行,oracle,stored-procedures,plsql,Oracle,Stored Procedures,Plsql,我在编写此过程时遇到以下错误: ORA-01722:无效号码ORA-06512:在 “BWSTAGE.加载触点程序”,第8行ORA-06512:第2行 很长时间以来我一直在试图解决这个问题,但我找不到解决办法。请帮助。ORA-01722:无效数字表示您试图在数字列中输入非数字值。因此,您需要检查在INSERT投影中引用的LOAD_CONTACT中的所有列,并将它们与VALUES子句中的列进行比较 有两种可能性: 两个投影不同步,您需要重新排序一个以匹配另一个 STAGE_联系人使用字符串列作为数

我在编写此过程时遇到以下错误:

ORA-01722:无效号码ORA-06512:在 “BWSTAGE.加载触点程序”,第8行ORA-06512:第2行


很长时间以来我一直在试图解决这个问题,但我找不到解决办法。请帮助。

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

有两种可能性:

  • 两个投影不同步,您需要重新排序一个以匹配另一个
  • STAGE_联系人使用字符串列作为数字属性。这在临时表中并不少见。但它确实留下了一种可能性,即暂存表包含无法转换为数字的字符串。这很难抓住 但您可以加入一些粗略的错误处理:

    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;
    
    这将为您提供一些信息,您可以使用这些信息查询STAGE_联系人并查找恶意值


    如果您是为一个真实的系统(而不是家庭作业)执行此操作,您应该调查Oracle的批量DML错误日志记录

    当insert循环中的其他人调试变量I.first_name时,添加异常。错误记录POST表格的DDL
    LOAD_CONTACT
    我认为insert。。选择(使用子查询)更好。如果您正在处理数百万行,也可以使用批量…stage_contact中student_id的数据类型为varchar(15),load_contact中的数据类型为数字(18,0)。当我从当前脚本中排除此列时,它已被执行。请检查并匹配暂存表和其他表的列数据类型。可能存在某些数据类型不匹配的问题。将字符串转换为数字会产生此问题。例如,在staging表中,Amount可能在Varchar中,其值为-100.90,并且u正试图将字段“Amount”插入当前表中,该字段为数字数据类型。这将导致-1722。请检查要插入的所有字段的数据类型。我会要求您添加批量收集选项,并尝试运行代码。两次没有注释的向下投票?我想知道这个答案中有什么是如此有争议的?
    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;