2013-12-12 4 views
3

에 문을 실행 :파이어 버드의의가 나는이 같은 코드가 있다고 가정 해 봅시다 BIGINT 이름 입력 매개 변수

execute block 
as 
declare var_mask bigint; 
declare var_dummy int; 
begin 
    var_mask = bin_shl(1, (64 - 1)); 

    execute statement (' 
select first 1 null 
from rdb$database 
where bin_and(cast(0 as bigint), :var_mask) <> cast(0 as bigint) 
    ') 
    (var_mask := var_mask) 
    into :var_dummy 
    ; 
end 

이 사람은 좋은 arithmetic exception, numeric overflow, or string truncation. numeric value is out of range. 제공합니다.

execute block 
as 
declare var_mask bigint; 
declare var_dummy int; 
begin 
    var_mask = bin_shl(1, (64 - 1)); 

    execute statement (' 
select first 1 null 
from rdb$database 
where bin_and(cast(0 as bigint), cast(:var_mask as bigint)) <> cast(0 as bigint) 
    ') 
    (var_mask := var_mask) 
    into :var_dummy 
    ; 
end 

아무도 이유를 알고 있나요 :

그것이 내가 변수의 명시 적 캐스팅을 할 필요가 작동하게하려면? 타입 정보가 있어야합니다, 안 그래요?

+0

파이어 버드는 바운드 변수의 유형이 아니라 [쿼리 자체 구조] (http://www.firebirdsql.org/refdocs/langrefupd25-sqlnull.html#langrefupd25-sqlnull-rationale)의 매개 변수 유형을 유추합니다 주변 언어의 변수에 대한 이해도 (동일한 것에 해당하는 것은 아닐 수도 있습니다). 일부는 이것을 엔진의 한계라고 생각합니다 (http://stackoverflow.com/a/11451797/132382). – pilcrow

+1

담근. 나는 사실 내 질문에 대답했다. :) –

+0

하. 나는 "기억 상실증"뱃지를 몇 번이나 받았습니다. – pilcrow

답변

1

실제로 입력 정보가 ​​더 이상 입력되지 않습니다 - 더 많은 here, 아드리아노의 답변에 추가하려면 :)

3

BIN_AND는 첫 번째 인수에 BIGINT를 전달할 때도 INTEGER로 두 번째 매개 변수를 설명하기 때문에. 이것이 좋은 것이 든 나쁜 것이 든 토론의 대상이됩니다.

+0

두 번째 버전은 어떻게 작동하나요? –

+0

"cast (: var_mask as bigint)"는 설명 된 매개 변수를 BIGINT로 만듭니다. 그것은 클라이언트의 "CAST (? AS SOME)"의 오래된 트릭과 같지만 주어진다면 "데이터 타입 에러"를 던질 것입니다. –