Sql ORA-01722从Crystal Reports的视图检索数据时
我在Oracle数据库上的SQLDeveloper中构建了一个视图 当我查询视图时,它不会出错 但是当我从Crystal Reports查询视图并尝试从Sql ORA-01722从Crystal Reports的视图检索数据时,sql,oracle,view,crystal-reports,Sql,Oracle,View,Crystal Reports,我在Oracle数据库上的SQLDeveloper中构建了一个视图 当我查询视图时,它不会出错 但是当我从Crystal Reports查询视图并尝试从varchar2字段(仅包含数字条目)和数字的混合计算中检索数据时,它抛出以下错误:22018 ORA-01722无效号码 表A: a Varchar2(20) b Number 视图: 有没有人遇到过类似的问题?更改数据类型不是一个选项。我还尝试将变量转换为“to_Number”,但这并没有阻止错误的发生。您将数字存储为字符串(这一直是个坏主
varchar2
字段(仅包含数字条目)和数字的混合计算中检索数据时,它抛出以下错误:22018
ORA-01722无效号码
表A:
a Varchar2(20)
b Number
视图:
有没有人遇到过类似的问题?更改数据类型不是一个选项。我还尝试将变量转换为“to_Number”,但这并没有阻止错误的发生。您将数字存储为字符串(这一直是个坏主意,但您已经说过您不能更改它),并且从注释中可以看出,它们是以句点作为小数分隔符的浮点值。您的SQL Developer NLS设置使隐式转换有效,但您的Crystal Reports NLS设置无效-虽然可能在某种程度上继承了PC的区域设置,但此处的相关部分是,在SQL Developer中,
NLS\u数字字符
最终为,.
,而不是,
您可能可以为Crystal Reports的安装更改NLS设置-我不使用它,因此无法确切地告诉您如何更改-但您仍将依赖其他任何查询您视图的人,他们也具有“正确”的NLS设置,这并不总是在您的控制之下
如果字符串始终采用相当标准的格式,具有最大的比例和精度,则可以更改视图定义,以包含字符串值中使用的十进制分隔符的知识
基本上,当您执行a*b
时,您正在执行隐式转换,您可以看到显式转换也会失败,使用到_char(a)*b
或强制转换(a作为数字)*b
。在不更改NLS设置的情况下,两者都将获得ORA-01722
您可以使用带句点分隔符的固定掩码进行转换:
select to_number(a, '999999.99') * b as value_ab from table_a;
或者使用更通用的分隔符符号D
,并覆盖NLS设置,在这种情况下,由于分隔符是固定的,这可能是过分的:
select to_number(a, '999999D99', 'NLS_NUMERIC_CHARACTERS=''.,''') * b
as value_ab from table_a;
无论哪种方式,您都需要能够指定小数点分隔符前后的最大位数,因此您可能需要
9.99999
或99999999
或其他变体-这完全取决于您的数据。如何使用检索到的值-是否将视图加入其他视图?您是在直接查询还是从报告中查询时添加过滤器?您是在SQLDeveloper中从结果集中检索所有行,还是仅仅看到第一次提取是正常的?很可能您的varchar2
列中确实有一个非数字值,只是不总是点击它。您在SQL Developer和Crystal Reports中的NLS设置是什么,您的字符串值是浮动的吗?您可以使用不同的NLS\u数字\u字符,这可能会导致带有十进制分隔符的字符串抛出该错误。不同的表连接到一个视图。视图包含一些过滤器,而报告包含其他过滤器。我还尝试将所有过滤器放入视图中,或者从子选择中选择数据(类型Varchar2)。我在视图中有大约140条记录,因此我能够获取所有行。我检查了记录,它们都是数字。但它们都是整数,还是有小数点分隔符?如果它们是浮点数,它们是否存储为1.23
或1,23
?NLS设置将影响这两个值的解释方式,以及它们是否可以转换。它们都是浮点值,如1.23
。SQL Developer中的设置(十进制分隔符='.')。我不确定crystal是否对此进行了全局设置,因此我将本地计算机设置设置为十进制分隔符=。我尝试了以下作为select statemens(参见上面的示例)5+'5.0'作为计算值
it也会抛出此错误。
select to_number(a, '999999D99', 'NLS_NUMERIC_CHARACTERS=''.,''') * b
as value_ab from table_a;