Sql 为什么';不要在这里抛出错误
我在看一个我没写的剧本。它看起来像这样:Sql 为什么';不要在这里抛出错误,sql,oracle,oracleexception,Sql,Oracle,Oracleexception,我在看一个我没写的剧本。它看起来像这样: SELECT ... AND ( A.FIELD IN ( ... ... ) OR B.FIELD IN ( ... ... ) ) ... 就其自身而言,脚本运行良好。没有错误。但当我将其更改为: SELECT ... AND B.FIELD IN ( ...
SELECT
...
AND (
A.FIELD IN
(
...
...
)
OR B.FIELD IN
(
...
...
)
)
...
就其自身而言,脚本运行良好。没有错误。但当我将其更改为:
SELECT
...
AND B.FIELD IN
(
...
...
)
...
Oracle抛出一个ORA-01722:无效数字
。为什么第一次查询时它不会抛出它呢
已更新
字段是一个数字
B.FIELD是一个VARCHAR2
所针对的值是一个数字。所以我理解并同意这个错误,但我想知道为什么在第一个查询中没有抛出它。但第二个是。来自Oracle的文档:
在计算逻辑表达式时,PL/SQL使用短路
评价也就是说,PL/SQL会在
结果是可以确定的。这使您可以编写以下表达式:
否则可能会导致错误
有关更多说明和示例,请参阅
他们还有这个单独的文档,特别提到对于
或:很难说,如果在中看不到B.FIELD
的中的任何值。我假设第一条语句不是在计算B.FIELD部分,因为A.FIELD在OR语句中为true,虽然我不确定SQL是否会对语句进行延迟求值。@X.L.Ant我已经更新了我的Q。我知道为什么会发生错误,但不知道为什么它不会出现在第一个语句中,而会出现在第二个语句中?Oracle如何执行这样的查询this@JGrice我想知道这一点,但出于我自己的兴趣和理解,我想我会在这里问一下,我想@JGrice是对的。Oracle不保证SQL短路,但我想不出除此之外的任何原因。我同意,但这是一个SQL查询,而不是PL/SQL。@troygizzi感谢Troy重现了这个错误。短路似乎在这里起作用,但我很惊讶,即使在类型不兼容的情况下也能起作用。除非在SQL中找到关于这个特殊情况的官方文档,否则我不会太依赖这个.PL/SQL短路,但是.@X.L.Ant谢谢,我只是查看了小提琴并复制了错误。我并没有在甲骨文方面做很多工作,所以我想我应该问问那些对甲骨文更有经验的人。