Finishing a project of S*** group S*** baseball team fan service mobile application
S그룹의 S야구단 하이브리드 앱을 만들었다.
이미지 참고
* server
- JAVA spring framework, MSSQL DB, JSON interface
- eclipse, heidi SQL
* client
- jQuery, jQuery template
- Morpheus framework (of 유라클)
- hybrid mobile application (for iOS, Android)
JHIL
2015년 12월 30일 수요일
2014년 10월 30일 목요일
[Spring + iBatis + Oracle] select query with function call
How can I querying select list after Oracle function call
파주에서 개발중에 생전 첨 보는 문데에 맞딱뜨렸다.
오라클 함수를 호출해서 서버와 세션을 맺어야 리스트 조회가 가능한 것이다.
흐흠...
그냥 생각에
function call 먼저 한 번 날리고,
그다음에 list query 날리면 될 거라는 초딩 수준의 생각을 했다면 결과는 뻔하다.
조회 안된다!
오라클 세션도 세션인지라,
하나의 세션 안에서 쿼리를 해야 조회가 되는 것이다.
PL/SQL 클라이언트 프로그램이야 당연히 DB 오픈하면서 세션을 물고 가기 때문에
함수 호출과 쿼리를 두번에 조회해도 조회가 되는 거였다.
그래서 생각해낸 대안은 이랬다.
1. function 와 select query 를 하나로 묶어서 procedure 를 만든다... 이거는 일이 더 커지므로 비추!!
2. select query 바로 앞단에 function call 을 해볼까?
<select id="getList" parameterClass="java.util.Map" resultClass="map">
{ call my_pkg.my_function(....
<![CDATA[
SELECT ....
해보면 아시겠거니와, 에러난다.
3. 마지막으로 At last!!!
하루동안 고민끝에 트랜잭션에 묶어보면 어떨까?
정말로 될까 긴가민가 했다. 결론은 됐다!!
<select id="getList" parameterClass="java.util.Map" resultClass="map">
<![CDATA[
SELECT ....
<procedure id="myMkgFuncCall" parameterClass="java.util.Map">
<![CDATA[
call my_pkg.my_function(....
자바에서 호출할 때,
UserDefinedRowHandler rowHandler = new MyRowHandler();
try {
sqlMapClientTemplate.getSqlMapClient().startTransaction();
sqlMapClientTemplate.getSqlMapClient().queryForObject("myMkgFuncCall", map);
sqlMapClientTemplate.getSqlMapClient().queryWithRowHandler("getList", map, rowHandler);
sqlMapClientTemplate.getSqlMapClient().endTransaction();
} catch (SQLException e) {
e.printStackTrace();
}
참고로 MyRowHandler 는 iBatis RowHandler 를 상속받아서 간단히 만들면 된다.
아마도 RowHandler 를 안쓰고 queryForList 로 해도 될 것 같다.
파주에서 개발중에 생전 첨 보는 문데에 맞딱뜨렸다.
오라클 함수를 호출해서 서버와 세션을 맺어야 리스트 조회가 가능한 것이다.
흐흠...
그냥 생각에
function call 먼저 한 번 날리고,
그다음에 list query 날리면 될 거라는 초딩 수준의 생각을 했다면 결과는 뻔하다.
조회 안된다!
오라클 세션도 세션인지라,
하나의 세션 안에서 쿼리를 해야 조회가 되는 것이다.
PL/SQL 클라이언트 프로그램이야 당연히 DB 오픈하면서 세션을 물고 가기 때문에
함수 호출과 쿼리를 두번에 조회해도 조회가 되는 거였다.
그래서 생각해낸 대안은 이랬다.
1. function 와 select query 를 하나로 묶어서 procedure 를 만든다... 이거는 일이 더 커지므로 비추!!
2. select query 바로 앞단에 function call 을 해볼까?
<select id="getList" parameterClass="java.util.Map" resultClass="map">
{ call my_pkg.my_function(....
<![CDATA[
SELECT ....
해보면 아시겠거니와, 에러난다.
3. 마지막으로 At last!!!
하루동안 고민끝에 트랜잭션에 묶어보면 어떨까?
정말로 될까 긴가민가 했다. 결론은 됐다!!
<select id="getList" parameterClass="java.util.Map" resultClass="map">
<![CDATA[
SELECT ....
<procedure id="myMkgFuncCall" parameterClass="java.util.Map">
<![CDATA[
call my_pkg.my_function(....
자바에서 호출할 때,
UserDefinedRowHandler rowHandler = new MyRowHandler();
try {
sqlMapClientTemplate.getSqlMapClient().startTransaction();
sqlMapClientTemplate.getSqlMapClient().queryForObject("myMkgFuncCall", map);
sqlMapClientTemplate.getSqlMapClient().queryWithRowHandler("getList", map, rowHandler);
sqlMapClientTemplate.getSqlMapClient().endTransaction();
} catch (SQLException e) {
e.printStackTrace();
}
참고로 MyRowHandler 는 iBatis RowHandler 를 상속받아서 간단히 만들면 된다.
아마도 RowHandler 를 안쓰고 queryForList 로 해도 될 것 같다.
피드 구독하기:
글 (Atom)