1. 程式人生 > >MYBATIS+DB2儲存過程驗證SQL語句正確性

MYBATIS+DB2儲存過程驗證SQL語句正確性

1.啟用DB2的explain功能:(需要有操作)

a.執行~sqllib/MISC/EXPLAIN.DDL

b.CALL SYSPROC.SYSINSTALLOBJECTS('EXPLAIN','C',NULL,CURRENT SCHEMA)--需要有DBA的許可權

2.寫DB2儲存過程:

CREATE OR REPLACE PROCEDURE VALIDATE_SQL (
    IN P_SQL	VARCHAR(256),
    OUT P_RESULT	INTEGER )
  SPECIFIC "SQL140507095557152"
  LANGUAGE SQL
  NOT DETERMINISTIC
  EXTERNAL ACTION
  MODIFIES SQL DATA
  INHERIT SPECIAL REGISTERS
  OLD SAVEPOINT LEVEL
BEGIN 
  DECLARE exit HANDLER FOR sqlexception set P_RESULT = 0;  
  BEGIN
    set current explain mode explain;
    EXECUTE IMMEDIATE P_SQL;
    set current explain mode no;
    SET P_RESULT = 1; 
  END;
END;
3.在MYBATIS中呼叫:

SERVICE:

Map<String, Object> paramMap = new HashMap<String, Object>(); 
paramMap.put("P_SQL", "111111111111111");
paramMap.put("P_RESULT", 0);
datacleanDetailDefMapper.validateSql(paramMap);
int result = (Integer) paramMap.get("P_RESULT");

MAPPER:

public void validateSql(Map paramMap);

XML:

<select  id="validateSql"   statementType="CALLABLE"   parameterType="map"  resultType="map">
	  CALL VALIDATE_SQL(
	           	#{P_SQL,
	           	   mode=IN,
	           	   jdbcType=VARCHAR
	           	   },
	           	 #{P_RESULT,
	           	   mode=OUT,
	           	   jdbcType=INTEGER
	           	   }
	      	 )
</select>
如果SQL可以執行,則P_RESULT為1,如果SQL執行中出現錯誤,則P_RESULT為0.