2011-02-15 2 views
4

PHP가있는 IBM i (AS400)에서 DB2 정보에 액세스합니다. 이 코드간단한 DB2 select 문에서 "데이터 변환 또는 데이터 매핑 오류 .SQLCODE = -802"가 표시되는 이유는 무엇입니까?

:

$query = "SELECT * FROM QS36F.MYTABLE WHERE MYFIELD=120006"; 
$result = db2_prepare($conn, $query); 
db2_execute($result); 

$i=0; 
while($row = db2_fetch_assoc($result) or die(db2_stmt_errormsg())){ 
    $i++; 
    print "Row " . $i . " successful<br />"; 
} 

내가 얻을 :

SELECT * FROM QS36F.MYTABLE MYFIELD = 120,006

행 1 성공적인
행이 성공적으로
3 행 성공
행 4 성공
데이터 변환 또는 데이터 매핑 오류. SQLCODE = -802

결과가 4 개 이상이어야합니다. 왜이 오류가 발생합니까?

자세한 내용 :

  • 이 같은 오류는
  • MYFIELD이 NUMERIC (7,0)
  • 이다 성공적인 결과를 다른 수의 후 수 있지만 내가 MYFIELD에서 검색 값에 일어날 것
  • 숫자 필드를 포함하여 테이블의 다른 필드를 검색 할 수 있으며 정상적으로 작동합니다.

답변

3

테이블에 잘못된 십진수 데이터가 있습니다. 0 대신 공백이 있습니다. 나는 그 공백에 0을 이동하고 다른 사람을 도울 수 있다면 그 문제를

+0

어떻게 찾았습니까? 동일한 문제가 있지만 잘못된 데이터를 찾을 수 없습니다. –

0

설명서에 따르면 SQL0802은 산술 오버플로입니다. 당신이 게시 한 코드에서 볼 수는 없지만 행 중 하나 이상에 대해 선언 한 PHP 변수에 비해 너무 큰 데이터 값이 있습니다. 그렇지 않으면 QS36F.MYTABLE 오브젝트가 실제로 다른 테이블에서 선택하는 뷰이고 컬럼 중 하나를 변환하는 경우와 같이 올바르게 실행되지 않는 다른 재미있는 데이터 변환이 있습니다.

+0

MYTABLE은 (는)보기가 아닙니다. PHP 변수에서 데이터 값은 어떻게 커질 수 있습니까? 하나의 열만 반환하는 선택을 시도했습니다. 그래서 나는 $ 행에 과부하가 걸릴 가능성을 제거한다고 생각합니다. – Mike

+0

PHP 변수가 오버플로되기 쉽습니다. 그러나 당신이'SELECT * FROM ... '을 사용하고 있고 우리에게 보여지는 컬럼 정의가 없기 때문에 여기에서 왜 일어나는지 알 수 없습니다. 프로덕션 코드에서 'SELECT * FROM ...'은 본질적으로 사용되지 않아야합니다. 명시적인 _column-list_를 지정하거나 다양한 답을 찾을 수 없다는 것을 받아들이십시오. – user2338816

2

고정, 저도 같은 오류를했고 나는 가 일치하지 않는 데이터 유형 간의 조인을 만들고 있었다 발견하십시오 DECIMAL(2,0) 필드와 VARCHAR(5) 필드. 우리는 으로 변환 될 때까지 VARCHAR을 사용할 수 있습니다. 그렇지 않으면 오류가 발생합니다.