oracle 问题 ORA-00933: SQL 命令未正确结束 如何解决?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 问题 ORA-00933: SQL 命令未正确结束 如何解决?相关的知识,希望对你有一定的参考价值。

参考技术A

1、测试前添加一个快照点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 &lt;= 2 或此查询:select latitude from db where case when translate(latitude, '-0123456789.a', 'a') is null then sin(latitude) end &lt;= 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 运算符结束

oracle ORA-00933;SQL 命令未结束!在线等

ORA-00933: UPDATE 命令的 SQL 命令未正确结束 [关闭]