问题:下面的sql写在javaDomainimpl中,第二段sql是带有具体数据的sql文,第二段在sql developer中可以执行,并且有结果。
但是同样的sql 文在java程序中执行,在控制台的执行效果如图三,但是取得不到结果。也没有报错。虽然在控制台输出语句执行的过程,但却没有结果。经过排除,问题出在SQL上。通过查找K_MST_TRADE_INDUSTRY_TYPE表结构,发下该表字段INDUSTRY_TYPE_KBN的结构如下:发现该字段是CHAR(4BYTE).如果这时该字段取值为图二‘001’时,在sql developer中会自动 将INDUSTRY_TYPE_KBN ='001'匹配为INDUSTRY_TYPE_KBN ='001 '补为4字节,然后去查找。所以在sql developer中可以查到数据。
但是在java中,执行该sql时,不会自动转换会按照‘001’去查找匹配的数据,但是数据库中存储的是‘001 ’4字节,所以查不到数据。
SELECT DISTINCT
t.TRADE_CODE TRADE_CODE ,
main.TRADE_NAME TRADE_NAME ,
main.trade_name_kana trade_name_kana,
main.area_kbn area_kbn,
main.del_flg del_flg
FROM K_MST_TRADE_INDUSTRY_TYPE t,
k_mst_trade_main main
WHERE t.TRADE_CODE = main.trade_code(+)
AND APPLY_YEAR BETWEEN /*wfgs2010Dto.kaisiNendo*/ AND /*wfgs2010Dto.endNendo*/
AND APPLY_BUSINESS_CODE=/*wfgs2010Dto.gyoumu*/
AND INDUSTRY_TYPE_KBN = /*wfgs2010Dto.gyousyuHid*/
SELECT DISTINCT t.TRADE_CODE TRADE_CODE ,
main.TRADE_NAME TRADE_NAME ,
main.trade_name_kana trade_name_kana,
main.area_kbn area_kbn,
main.del_flg del_flg
FROM K_MST_TRADE_INDUSTRY_TYPE t,
k_mst_trade_main main
WHERE t.TRADE_CODE = main.trade_code(+)
AND APPLY_YEAR BETWEEN '2009' AND '2019'
AND APPLY_BUSINESS_CODE='001'
AND INDUSTRY_TYPE_KBN ='001'
发现该字段是CHAR(4BYTE)
解决办法:在java中补全位数。使用Rpad( ,4,' ')或者Lpad( ,4,' ')
SELECT DISTINCT t.TRADE_CODE TRADE_CODE ,
main.TRADE_NAME TRADE_NAME ,
main.trade_name_kana trade_name_kana,
main.area_kbn area_kbn,
main.del_flg del_flg
FROM K_MST_TRADE_INDUSTRY_TYPE t,
k_mst_trade_main main
WHERE t.TRADE_CODE = main.trade_code(+)
AND APPLY_YEAR BETWEEN /*wfgs2010Dto.kaisiNendo*/ AND /*wfgs2010Dto.endNendo*/
AND APPLY_BUSINESS_CODE=/*wfgs2010Dto.gyoumu*/
AND INDUSTRY_TYPE_KBN = Rpad(/*wfgs2010Dto.gyousyuHid*/,4,' ')