2014-10-20 2 views
0

나는 여기에 쓰지 않은 스크립트를보고있다. 그것은에오라클이 여기에 오류를 던지지 않는 이유

SELECT 
... 
AND (
     A.FIELD IN 
     (
     ... 
     ... 
     ) 
     OR B.FIELD IN 
     (
     ... 
     ... 
     ) 
    ) 
... 

스크립트가 잘 실행 소유이다 : 그것은 다음과 같이 보입니다. 오류 없음. 나는 그것을 변경할 때 :

SELECT 
... 
AND B.FIELD IN 
     (
     ... 
     ... 
     ) 
... 

오라클은 ORA-01722: invalid number가 발생합니다. 어떻게 그것이 첫 번째 쿼리를 위해 던지지 않는가?

업데이트

A.FIELD 숫자 B.FIELD는 VARCHAR2

값은에 노력하는 숫자입니다입니다. 그래서 나는이 오류를 이해하고 동의하지만 첫 번째 질의에 왜 던지지 않았는지 궁금해했다. 그러나 두 번째입니다. 오라클의 문서에서

+2

http://www.oracle-base.com/articles/misc/short-circuit-evaluation-in-plsql.php는'B.FIELD'의'IN'의 값 중 하나를 보지 않고 말할 수 :

그들은이 별도의 문서 구체적으로 OR에 대한 그 언급이있다. –

+3

SQL 문을 느리게 평가하는지 확실하지 않지만 A.Field가 OR 문에서 true이므로 첫 번째 문이 B.Field 섹션을 평가하지 않는다고 가정합니다. – Grice

+0

@ X.L.Ant 필자는 Q를 업데이트했습니다. 오류가 발생하는 이유를 이해하지만 첫 번째 문에는 나타나지 않지만 두 번째 문에서는 발생하지 않는 이유를 이해합니다. 오라클은 다음과 같은 쿼리를 어떻게 실행합니까? – Jonnny

답변

2

는 :

논리식을 평가, PL/SQL은 단락을 평가를 사용합니다. 즉, PL/SQL은 결과를 결정할 수있는 즉시 표현식을 평가하지 않습니다. 이렇게하면 이 오류를 유발할 수있는 표현식을 작성할 수 있습니다.

자세한 설명 및 예는 http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/fundamentals.htm#sthref481을 참조하십시오. 하드

+2

나는 동의하지만 이것은 PL/SQL이 아닌 SQL 쿼리이다. –

+0

@troygizzi이 트로이를 주셔서 감사합니다 – Jonnny

+1

[This fiddle] (http://sqlfiddle.com/#!4/a6611/3)이 오류를 재생산합니다. 단락이 여기서는 효과가있는 것처럼 보이지만 형식이 호환되지 않으므로이 기능이 작동하는 것에 상당히 놀랐습니다. SQL에서이 특정 케이스에 대한 공식 문서를 찾지 않는 한, 이것에 너무 의존하지 않을 것입니다. –