Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql ORA-01722从Crystal Reports的视图检索数据时_Sql_Oracle_View_Crystal Reports - Fatal编程技术网

Sql ORA-01722从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”,但这并没有阻止错误的发生。您将数字存储为字符串(这一直是个坏主

我在Oracle数据库上的SQLDeveloper中构建了一个视图

当我查询视图时,它不会出错

但是当我从Crystal Reports查询视图并尝试从
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;