ORA-01722:无效编号01722。00000-“无效编号”

时间:2019-03-19 09:33:56

标签: sql oracle

我正在尝试执行查询,但始终显示错误

  

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;

2 个答案:

答案 0 :(得分:0)

  

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

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

  

ORA-01722无效号码

     

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

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

答案 1 :(得分:0)

  

我所有的表列都是varchar2类型

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

尽管这是您当前的数据模型,但是您正在执行一些隐式转换。

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

这里有很多问题。 REPLACE()似乎毫无意义,因为您的格式模型不使用逗号。通过向格式模型添加TRIM()修饰符可以避免FM调用。如果AMOUNTvarchar2,则将其与具有AMOUNT < '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设置作为转换的一部分,{{3 }}。