【问题标题】:ORA-01722: invalid number 01722. 00000 - "invalid number"ORA-01722: 无效号码 01722. 00000 - “无效号码”
【发布时间】:2019-08-09 18:47:33
【问题描述】:

我正在尝试执行查询,但它一直给出错误

ORA-01722: 无效号码 01722. 00000 - “无效号码”

我检查了我的表中是否有像 01722. 00000 或类似的数字,但没有。如果我在非数值中使用算术运算符,如果我将数值和非数值一起比较但仍然没有,我还检查了查询。我所有的表格列都是varchar2 类型现在已经一整天了,我还没有找到解决方法。查询如下:

select distinct 
 xmlroot(
 xmlelement("ftc:F_OE",
    xmlattributes('http://www.w3.org/2001/XMLSchema-instance' as 
      "xmlns:xsi", 
        'urn:oecd:ties:f:v1' as "xmlns",
        'urn:oecd:ties:f:v2' as "xmlns:ftc",
        'urn:oecd:ties:isoftypes:v1' as "xmlns:iso",
        'urn:oecd:ties:stftypes:v2' as "xmlns:sfa"      
    )
    ,          

    xmlelement("ftc:MessageSpec", 
        xmlelement("sfa:SendingCompanyIN", 'SL.008'),
        xmlelement("sfa:TransmittingCountry", 'AL'),
        xmlelement("sfa:ReceivingCountry", 'IT'),
        xmlelement("sfa:MessageType", 'F'),
        xmlelement("sfa:Warning", ''),
        xmlelement("sfa:Contact", ''),
        xmlelement("sfa:MessageRefId", 'SL.008.2018_aabb'),
        xmlelement("sfa:ReportingPeriod", '2018-12-31'),
        xmlelement("sfa:Timestamp", TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD"T"HH24:MI:SS'))                
    ,''),

    XMLAGG(xmlelement("ftc:F",

        xmlelement("ftc:ReportingFI",
            xmlelement("sfa:ResCountryCode", 'AL'),      
            xmlelement("sfa:TAX_ID", xmlattributes('IT' as "issuedBy"),'SL.008'),      
            xmlelement("sfa:Name", 'SHPK'),
            xmlelement("sfa:Address",
                xmlelement("sfa:CountryCode", 'AL'),
                xmlelement("sfa:AddressFix", 
                    xmlelement("sfa:Street", 'xxx'),
                    xmlelement("sfa:BuildingIdentifier", ''),
                    xmlelement("sfa:SuiteIdentifier", ''),
                    xmlelement("sfa:FloorIdentifier", ''),
                    xmlelement("sfa:DistrictName", ''),
                    xmlelement("sfa:POB", ''),
                    xmlelement("sfa:PostCode", '1234'),
                    xmlelement("sfa:City", 'YYYY'),
                    xmlelement("sfa:CountrySubentity", 'AB')
                ,''),-- sfa:AddressFix END
                xmlelement("sfa:AddressFree", 'streeetName, city, postalcode, AL')                                
            ,''), 
            xmlelement("ftc:FilerCategory", 'F604'),
            xmlelement("ftc:DocSpec",
                xmlelement("ftc:DocTypeIndic", 'F1'),
                xmlelement("ftc:DocRefId", CUSTOMER_NO),
                xmlelement("ftc:CorrMessageRefId", ''),
                xmlelement("ftc:CorrDocRefId", '')
            ,'')                   
        ,''),

        (
            SELECT xmlagg(
                xmlelement("ftc:ReportingGroup", 
                    xmlelement("ftc:AccountReport",
                        xmlelement("ftc:DocSpec",
                            xmlelement("ftc:DocTypeIndic", 'F1'),
                            xmlelement("ftc:DocRefId", CUSTOMER_NO),
                            xmlelement("ftc:CorrMessageRefId", ''),
                            xmlelement("ftc:CorrDocRefId", '')
                        ,'')
                        ,
                        xmlelement("ftc:AccountNumber", f2.ACC_NO),
                                xmlelement("ftc:AccountClosed", 'false'), 
                        xmlelement("ftc:AccountHolder", 
                            xmlelement("ftc:Individual",
                                xmlelement("sfa:ResCountryCode", 'AL'),
                                xmlelement("sfa:TAX_ID", xmlattributes('IT' as "issuedBy"),TAX_ID),
                                xmlelement("sfa:Name",
                                    xmlelement("sfa:PrecedingTitle",''),
                                    xmlelement("sfa:Title",''),
                                    xmlelement("sfa:FirstName",trim(first_name)),
                                    xmlelement("sfa:MiddleName",trim(MIDDLE_NAME)),
                                    xmlelement("sfa:NamePrefix",''),
                                    xmlelement("sfa:LastName",trim(last_name)),
                                    xmlelement("sfa:GenerationIdentifier",''),
                                    xmlelement("sfa:Suffix",''),
                                    xmlelement("sfa:GeneralSuffix",'')
                                ,'') 
                                ,
                                xmlelement("sfa:Address", 
                                    xmlelement("sfa:CountryCode", 'AL'),
                                    xmlelement("sfa:AddressFix", 
                                        xmlelement("sfa:Street", ''),   
                                        xmlelement("sfa:BuildingIdentifier", ''),
                                        xmlelement("sfa:SuiteIdentifier", ''),
                                        xmlelement("sfa:FloorIdentifier", ''),
                                        xmlelement("sfa:DistrictName", ''),
                                        xmlelement("sfa:POB", ''),
                                        xmlelement("sfa:PostCode", ''),
                                        xmlelement("sfa:City", ''),
                                        xmlelement("sfa:CountrySubentity", '')
                                    ,''),
                                    xmlelement("sfa:AddressFree", ADDRESS)                                
                                ,'')
                                ,
                                xmlelement("sfa:BirthInfo",
                                    xmlelement("sfa:BirthDate", to_char(TO_DATE(DATE_OF_BIRTH,'MM/DD/YYYY'),'YYYY-MM-DD')),
                                    xmlelement("sfa:City" , ''),
                                    xmlelement("sfa:CitySubentity", '')
                                ,'')                                                  
                            ,'') 
                        ,''), 

                        xmlelement("ftc:AccountBalance", xmlattributes(CCY as "currCode"),REPLACE(
          case 
            when AMOUNT < '1' then
            trim(to_char(AMOUNT,'0.99'))
            else
            trim(to_char(AMOUNT,'99999999999.99'))
            end,',','.') ),
          case when ACCRUAL <> '0' then
            xmlelement("ftc:Payment",
                xmlelement("ftc:Type",'FATCA502'),
                xmlelement("ftc:PaymentAmnt",xmlattributes(CCY as "currCode"),
                case 
            when ACCRUAL < '1' then
            trim(to_char(ACCRUAL,'0.99'))
            else
            trim(to_char(ACCRUAL,'99999999999.99'))
            end))
          end

                    ,'') 
                ,'')
            )
            FROM F_2019 f2
            WHERE f1.CUSTOMER_NO = f2.CUSTOMER_NO  
        ) 
    ,'')) 

,'') 
  ,VERSION '1.0') as F_2019
    from (select distinct CUSTOMER_NO, TAX_ID  from F_2019) f1;

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    我检查了我的表中是否有类似 01722. 00000 或类似的数字

    可能没有。 01722 是 Oracle 错误代码:

    ORA-01722 无效号码

    原因:尝试将字符串转换为数字失败,因为字符串不是有效的数字文字。在算术函数或表达式中只能使用数字字段或包含数字数据的字符字段。只能在日期中添加或减去数字字段。

    您发布了很多代码;我不知道可能是什么原因造成的。从CASE 开始检查代码,TO_CHAR 函数调用是否正常工作,是否正确使用单引号(或不正确)等。

    【讨论】:

      【解决方案2】:

      我所有的表格列都是varchar2 类型

      这很可能是您的问题的一部分;您应该为所有列使用正确的数据类型。

      鉴于这是您当前的数据模型,您正在进行一些隐式转换。

      ... REPLACE(
                case 
                  when AMOUNT < '1' then
                  trim(to_char(AMOUNT,'0.99'))
                  else
                  trim(to_char(AMOUNT,'99999999999.99'))
                  end,',','.') ...
      

      这里有很多问题。 REPLACE() allears 毫无意义,因为您的格式模型不使用逗号。可以通过将FM 修饰符添加到格式模型来避免TRIM() 调用。如果AMOUNTvarchar2,那么与带有AMOUNT &lt; '1' 的字符串进行比较是有道理的,但是该字符串值中的前导零会导致问题,最好将其作为数字而不是作为字符串进行比较(但无论如何它应该是一个数字!)。您可能可以将整个表达式替换为:

      ... to_char(AMOUNT,'FM99999999990.00') ...
      

      但主要问题是to_char(AMOUNT,'0.99') 或任何格式模型都将AMOUNT 字符串隐式转换为数字 - 它确实在做to_char(to_number(AMOUNT),'0.99') - 所以可能是这样(或者稍后对于ACCRUAL ) 这是错误的,因为表列包含无法隐式转换的字符串值。

      如果您执行select to_number(amount) from F_2019,您可能会看到相同的错误。然后您只需要弄清楚原因 - 您在该列中是否有格式错误的数据,或者它是否如您所愿但隐式转换未假定实际格式。

      在没有看到您的数据的情况下,我们无法判断是哪种情况,或者您应该如何解决它。您要么需要识别和修复格式错误的数据,要么排除您知道正确但不应转换的数据,或者使用对所有数据都正确的格式模型将隐式转换更改为显式转换(就像您之前所做的那样DATE_OF_BIRTH),可能是这样的:

      ... to_char(to_number(AMOUNT, '999,999,999,999.99'), 'FM99999999990.00') ...
      

      但显然我完全猜到了你的字符串可能是什么样子。您的字符串可能有逗号作为小数点分隔符(从 REPLACE() 猜测),因此您可能需要/想要使用 D 标记,并指定 NLS 设置作为转换的一部分,as here

      【讨论】:

        猜你喜欢
        • 2023-03-15
        • 2020-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-12
        • 2018-02-14
        相关资源
        最近更新 更多