2011-02-15 481 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 WHERE MyField的= 120006

行1成功
行2次成功
第3行成功
第4排成功
數據轉換或數據映射錯誤。 SQLCODE = -802

應該有4個以上的結果。 爲什麼會發生此錯誤?

更多細節:

  • 此相同的錯誤似乎對我MyField的搜索任何價值的情況發生,雖然它可能是一個不同數量的中標結果
  • MyField的是數字(7,0)
  • 我可以搜索表中的其他字段(包括數字),它工作正常。

回答

3

表中有無效的十進制數據。有空白而不是零。我搬到零到這些空白和解決了這一問題

0

根據文檔,SQL0802是算術溢出。儘管在您發佈的代碼中看不到這些數據,但其中有一行的數據值對於您聲明的php變量來說太大了。否則還有一些其他有趣的數據轉換不能正確地發生,例如,如果QS36F.MYTABLE對象實際上是一個從另一個表中選擇的視圖,並且正在轉換其中一列。

+0

MYTABLE不是一個視圖。對於php變量,數據值如何變大?我試着做一個只返回一列的select。所以我認爲這將消除$ row被超載的可能性。 – Mike 2011-02-16 13:19:38

+0

溢出PHP變量可能很容易。但是因爲你使用`SELECT * FROM ...`,並且沒有向我們顯示列定義,所以我們不能說出它在這裏發生的原因。在生產代碼中,`SELECT * FROM ...`本質上不應該被使用;指定一個明確的_column-list_或者簡單地接受將永遠不會找到各種答案。 – user2338816 2014-04-03 04:27:34

2

如果它可以幫助別人,我有同樣的錯誤,發現我是在不匹配的數據類型之間的連接:一個DECIMAL(2,0)場和VARCHAR(5)場。直到我們有VARCHAR s可以轉換成DECIMAL(2,0)它可以工作,否則會拋出錯誤。

相關問題