1. 程式人生 > 其它 >DB2 SQL Error: SQLCODE=-302, SQLSTATE=22001, SQLERRMC=null

DB2 SQL Error: SQLCODE=-302, SQLSTATE=22001, SQLERRMC=null

今天不得不吐槽下 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%')就沒任何問題了!

雖然是解決了問題,但還是沒弄明白是什麼原因導致這個問題發生的,還是掌握的知識太少啊。。。