我正在尝试执行查询,但始终显示错误
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;
答案 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
调用。如果AMOUNT
是varchar2
,则将其与具有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 }}。