今天不得不吐槽下 DB2了,不過也不定是因為DB2,因為之前寫了一段sql語句能執行,但是最近發現又報錯,
錯誤代碼-302,很奇怪,在網上搜索了差不多一天都是說“sql中要更新的某個字段的長度超過了數據庫表中字段的定義長度”!
但是和這個也不沾邊啊,我寫的是查詢語句,既然這樣我就重新寫了sql語句,用了不同的函數達到同樣的需求,也沒想到,
真沒想到竟然成功了!!!
下面是我的部分sql語句:
select a.act_consume_qty,a.act_amount,b.output_qty,c.budget_consume_qty,c.budget_amount,d.budget_output_qty from ( select nvl(sum(act_consume_qty),0) as act_consume_qty,nvl(sum(act_amount),0) as act_amount from tmmicsalj01 where (prod_unit = #prodUnit# or (#prodUnit# = '’ and prod_unit not like 'A%')) and prod_date BETWEEN #dateTimeStart# AND #dateTimeEnd# ) a,
以前where后
(prod_unit = #prodUnit# or (#prodUnit# = '' and prod_unit not like 'A%')) and prod_date BETWEEN #dateTimeStart# AND #dateTimeEnd#
的語句中#prodUnit# = ''當prodUnit=''時沒問題,但prodUnit不為空字符串時,就會報錯。
修改之后的語句:
select a.act_consume_qty,a.act_amount,b.output_qty,c.budget_consume_qty,c.budget_amount,d.budget_output_qty from ( select nvl(sum(act_consume_qty),0) as act_consume_qty,nvl(sum(act_amount),0) as act_amount from tmmicsalj01 where (prod_unit = #prodUnit# or (LENGTH(TRIM(#prodUnit#)) = 0 and prod_unit not like 'A%')) AND(MAT_CODE = #rawProdCode# OR (LENGTH(TRIM(#rawProdCode#)) = 0 AND MAT_CODE LIKE 'C%')) and prod_date BETWEEN #dateTimeStart# AND #dateTimeEnd# ) a,
把#prodUnit# = ' '換成prod_unit = #prodUnit# or (LENGTH(TRIM(#prodUnit#)) = 0 and prod_unit not like 'A%')就沒任何問題了!
雖然是解決了問題,但還是沒弄明白是什么原因導致這個問題發生的,還是掌握的知識太少啊。。。