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 为什么';不要在这里抛出错误_Sql_Oracle_Oracleexception - Fatal编程技术网

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谢谢,我只是查看了小提琴并复制了错误。我并没有在甲骨文方面做很多工作,所以我想我应该问问那些对甲骨文更有经验的人。