oracle 问题 ORA-00933: SQL 命令未正确结束 如何解决?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 问题 ORA-00933: SQL 命令未正确结束 如何解决?相关的知识,希望对你有一定的参考价值。
参考技术A1、测试前添加一个快照点call dbms_workload_repository.create_snapshot();。
2、然后开始测试.或者程序运行完。测试完后,再加一个快照点。
3、打开toad for oracle软件连接oracle数据库。如果连接不上,需要配置系统环境变量,把Oracle的客户端目录配置下。
4、环境变量配置好的之后,打开小娃【连接】-->【连接参数】自动识别Oracle的.ora文件。
5、然后【数据库】-【监视】-【AWR报告】。
6、然后选择前后的快照点。然后run。最好的选择html文件。
Oracle sql 错误 ora-01722 无效数字 ora-02063 前行来自
【中文标题】Oracle sql 错误 ora-01722 无效数字 ora-02063 前行来自【英文标题】:Oracle sql error ora-01722 invalid number ora-02063 preceding line from 【发布时间】: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'
错误,反之亦然。跨度>
【参考方案1】:
因此,LATITUDE
似乎存储为数字,并且其中一些值不是数字。
也许这样的查询可以帮助您找出问题所在:
select latitude
from db
where translate(latitude, '-0123456789.a', 'a') is not null;
这不是一个完美的测试,但它通常有效。
编辑:
更好的方法是使用正则表达式:
select latitude
from db
where not regexp_like(latitutde, '^-?[[:digit:]]*[.]?[[:digit:]]*$')
【讨论】:
感谢您的帮助。运行此查询后返回了一些值。所以我认为这就是问题所在。但是,我认为这个查询可以解决问题: select latitude from (select (LATITUDE) from irtt_meter_mv@cmomrpd where translate(latitude, '-0123456789.a', 'a') is null) where sin(latitude) @syan。 . .您可能还有其他格式错误的值,例如“-42-42”。 有没有其他方法可以在SIN运算之前过滤掉非数字数据或将其转换为数字?【参考方案2】:在 cmets 中进行调查后,这似乎是直接 SQL 客户端和 ADODB 连接之间 NLS 设置的差异。因为您将数字存储为字符串(这总是一个坏主意)并且数字有小数分隔符,所以不同的 NLS_NUMERIC_CHARACTERS 设置会导致一个地方出错,而另一个地方不会出错。
当您从字符串隐式转换为数字时,或者如果您有一个没有格式掩码的显式 to_number()
调用,Oracle 会使用该 NLS 设置。因此,在任何环境中,这些语句中的一个都可以工作,而另一个将得到 ORA-01722 错误:
select to_number('0,1') from dual;
select to_number('0.1') from dual;
哪个失败取决于 NLS 设置。您可以使用显式格式掩码来避免这种情况,并使用to_number()
的第三个参数来说明如何解释它:
select to_number('0,1', '99D99999', 'NLS_NUMERIC_CHARACTERS='',.''') from dual;
select to_number('0.1', '99D99999', 'NLS_NUMERIC_CHARACTERS=''.,''') from dual;
这是使用 D
小数分隔符标记,它对应于 NLS 覆盖中的第一个字符 - 请注意这两个语句之间的句点和逗号切换 - 并且必须设置 NLS 覆盖以匹配您的实际数据.当然,您还需要在小数点前后使用适当的数字。
假设您正在处理decimal degrees,您应该能够使用:
select to_number(latitude, '999D99999999', 'NLS_NUMERIC_CHARACTERS=''.,''')
from irtt_meter_mv@cmomprd;
纬度只需要小数点前两个九,但经度需要三个九,所以最好保持一致。
但您还需要在引用它的任何地方进行显式转换,例如:
select to_number(latitude, '999D99999999', 'NLS_NUMERIC_CHARACTERS=''.,''')
from irtt_meter_mv@cmomprd;
where abs(to_number(latitude, '999D99999999', 'NLS_NUMERIC_CHARACTERS=''.,''')) < 45;
如果您一开始就使用正确的数据类型,就可以避免这种情况。如果您无法更改列类型,您可以考虑添加一个虚拟列来为您执行相同的转换,或者如果不允许更改类型的视图。
较早的答案与 Gordon Linoff 的答案有所不同,但结果却是红鲱鱼。
【讨论】:
感谢您的建议,但在使用'select latitude from db where case when not regexp_like(latitude, '^-?[[:digit:]]*[.]?[[:digit:]]*$') then sin(latitude) end <= 2
或此查询:select latitude from db where case when translate(latitude, '-0123456789.a', 'a') is null then sin(latitude) end <= 2
时我仍然遇到相同的错误。请注意,我刚刚简化了查询,以便更容易调试并理解这将返回所有行。目标是在没有此错误的情况下运行查询。
@syan - 你能澄清latitude
列的数据类型是什么吗?如果它是一个字符串,那么 select to_number(latitude) from irtt_meter_mv@cmomprd
根本没有 where 子句,从您的 SQL 客户端和通过 ADODB 做什么?
该查询出现同样的错误。我不确定纬度的数据类型是什么。有没有办法查出来?
查询 all_tab_columns 视图。但它似乎是一个字符串,这是我们一直在假设的。因此,如果可以的话,接下来要检查的是两个会话中的 NLS_NUMERIC_CHARACTERS 值。
@sayan - 或者看看这是否是问题所在,在两者中尝试select to_number(latitude, '999D99999999', 'NLS_NUMERIC_CHARACTERS = '',.''') from irtt_meter_mv@cmomprd
;并重复逗号和句点切换,... = ''.,''')...
。如果我是对的,您将在两个会话中看到其中一项工作。有关更多信息,请参阅编辑后的答案。以上是关于oracle 问题 ORA-00933: SQL 命令未正确结束 如何解决?的主要内容,如果未能解决你的问题,请参考以下文章
如何解决 ORA-00933:SQL 命令未在 oracle 中正确结束?
oracle 问题 ORA-00933: SQL 命令未正确结束 如何解决?
在更新 cx_oracle 中的表时出现 DatabaseError: ORA-00933: SQL 命令未正确结束
ORA 00933:SQL 命令未正确以 Oracle 中的 IN 运算符结束