【发布时间】:2015-10-20 00:39:44
【问题描述】:
我在 oracle sql developer 中运行了一个 sql 查询,它工作得很好,但是当我使用包装器(在本例中为 excel vba 中的 adodb)来执行相同的查询时,我得到了一个错误。我怀疑 adodb 使用的是不同版本的 oracle,并且优化方式不同。
我运行的查询是:
select (LATITUDE) from db where sin(LATITUDE) <= 45.0;
我得到错误:
ORA-01722: 无效号码
ORA-02063:来自 db 的前一行
如果我将查询中的sin(LATITUDE) <= 45.0 更改为:
LATITUDE <= 45.0(不起作用)
LATITUDE <= '45.0'(有效)
sin(LATITUDE) <= '45.0'(不起作用)
to_number(sin(LATITUDE)) <= 45.0(不起作用)
sin(to_number(LATITUDE)) <= '45.0'(不起作用)
我还尝试将 LATITUDE 转换为浮点数,但这也不起作用。它运行的唯一实例是没有 SIN 并且在条件右侧的浮点值周围带有单引号。
我不知道为什么即使查询在 Oracle SQL Developer 中运行良好,我也无法在没有任何错误的情况下运行。任何帮助将不胜感激。
【问题讨论】:
-
当你在 SQL Developer 中运行它时,你只是得到数据网格中的第一页值吗?如果您检索结果集中的所有行(滚动到网格底部,或作为脚本运行),我希望您会看到相同的错误;目前,您只是没有到达包含错误数据的行。纬度是存储为数字还是字符串?
-
没有。我在 SQL Developer 中得到了全部内容。但是通过 ADODB,查询甚至不会运行并产生错误。
-
那个查询没有意义(除了数据类型和数据问题是你的实际错误的根源)。根据定义,数字的
sin介于-1 和1 之间。检查它是否小于45 没有意义。也许您想要latitude <= 45的行? -
想到的不同行为的另一种可能性;假设
latitude是一个 varchar2 列,因为(我认为)我们一直在假设:它是否包含带有句点或逗号或两者兼有的十进制值的字符串?如果会话获得不同的NLS_NUMERIC_CHARACTERS设置,您可能会在一个会话中看到错误,但在另一个会话中看不到错误 - 在一个会话中,'0,1'的隐式转换将起作用,而'0.1'错误,反之亦然。跨度>
标签: sql oracle oracle11g adodb