단, MIPQueryService 를 사용하여 바로 procedure 를 실행할 수 없으므로 일반 QueryService 를 사용하여 procedure 에서 CURSOR 처리한 것을 List 형태로 자동으로 얻어올 수 있습니다. MiPlatform의 dataset 으로 되돌려주기를 원하신다면 이를 Dataset 으로 재가공하셔야 합니다. mi 쪽의 dataset API 를 사용하여 직접 변환하셔도 되지만, Anyframe Web 의 AnyframeMiPDispatchController 를 사용하고 계시다면 아래의 예에서와 같이 프레임워크에서 제공하는 변환 기능을 사용하여 쉽게 처리 가능합니다.
..
public class TestController extends AnyframeMiPDispatchController {
..
public void selectCategoryList(PlatformRequest platformRequest,
VariableList inVl, DatasetList inDl, VariableList outVl,
DatasetList outDl) throws Exception {
// miplatform UI 로 부터 inVl 로 procedure 호출을 위한 입력조건을 받았을 때 - 일반 queryService 호출을 위해 Map 으로 변경
Map inVal = new HashMap();
inVal.put("inCondition", inVl.getValueAsString("inCondition"));
// queryService - procedure call
Map results = queryService.execute("callCursorTestProcedure", inVal);
// CURSOR 타입의 OUT 변수로 지정한 outResults 로 부터 바로 List 형태의 결과를 바로 얻음
List resultList = (List) results.get("outResults");
// dataset 으로 변환
Dataset resultDs = this.convertVoListToDataset("resultDs", resultList, false);
if (resultDs == null) {
throw new Exception("no data");
} else {
outDl.addDataset("ds_access", resultDs);
}
}
2. 실행된 sql 을 바로 얻을 수 있는 방법은 없습니다.
queryService 의 맵핑 xml 에 존재하는 쿼리문을 queryId 기반으로 얻어낼 수는 있습니다.
SELECT * FROM TEST_CATEGORY
where 1=1
#if($param.categoryName && $param.categoryName != "")
and CATEGORY_NAME like '%'|| :param.categoryName ||'%'
#end
log4jdbc 를 사용한 DB 접속 및 실행 정보를 로깅할 수 있으므로 아래와 같이 log4j 를 통해 수집되는 sql 문을 활용할 수도 있겠습니다. 별도의 FileAppender 나 JDBCAppender 등으로 로그를 재참조할 수 있도록 저장해두고 별도의 프로그램을 통해 바인드변수까지 처리된 해당 시점의 동적 쿼리문을 확인할 수 있습니다.
동시에 여러 client 가 사용하는 경우 원하는 쿼리문의 명확한 한정이 어려울 수도 있겠네요.
..
<appender name="file" class="org.apache.log4j.FileAppender">
<param name="File" value="./logs/query.log" />
<!-- test 편의를 위해 매번 새로 file 덮어쓰도록 Append false로 설정 -->
<param name="Append" value="false" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %5p [%c] %m%n" />
</layout>
</appender>
..
<!-- log SQL with timing information, post execution -->
<logger name="jdbc.sqltiming" additivity="false">
<level value="INFO" />
<appender-ref ref="console" />
<appender-ref ref="file" />
</logger>
..
Log log = LogFactory.getLog("jdbc.sqltiming");
log.info("★start★");
List resultList =
(List) queryService.find("selectCategoryList",
new Object[] {new Object[] {"param", paramMap } });
log.info("★end★");
2009-04-24 19:47:39,562 INFO [jdbc.sqltiming] ★start★
2009-04-24 19:47:39,671 INFO [jdbc.sqltiming] SELECT * FROM TEST_CATEGORY where 1=1 and CATEGORY_NAME like '%'|| 'food' ||'%' {executed in 15 msec}
2009-04-24 19:47:39,703 INFO [jdbc.sqltiming] ★end★
위의 내용에 대해 간단하게 테스트 프로젝트를 만들어 봤습니다. Anyframe 3.2.0 Library 와 miplatform 관련 jar 는 포함하지 않았으며 아키텍처나 여타의 고려없이 기능테스트 용도로 최소 구현하였습니다. 라이브러리를 맞춰 잡으신 후 jdbc.properties 에 본인이 사용 가능한 Oracle 접속 설정으로 바꾸고 CallaleStatementTest 를 JUnit 으로 실행하면 됩니다.
파일 첨부가 잘 안되네요 ^^;;
원하는 답변이 될지 모르겠습니다 ^^
1. 프로시져의 결과로 리스트 데이터를 얻고 싶다는 말씀 같습니다. Oracle 을 쓰신다는 가정하에 일반적으로 프로시져 내에서 CURSOR 타입의 OUT 변수를 리턴하여 처리가 가능합니다.
관련 내용은 http://dev.anyframejava.org/jira/browse/CORE-64 , http://dev.anyframejava.org/jira/secure/attachment/10224/QueryServiceCal... 를 참고하세요.
단, MIPQueryService 를 사용하여 바로 procedure 를 실행할 수 없으므로 일반 QueryService 를 사용하여 procedure 에서 CURSOR 처리한 것을 List 형태로 자동으로 얻어올 수 있습니다. MiPlatform의 dataset 으로 되돌려주기를 원하신다면 이를 Dataset 으로 재가공하셔야 합니다. mi 쪽의 dataset API 를 사용하여 직접 변환하셔도 되지만, Anyframe Web 의 AnyframeMiPDispatchController 를 사용하고 계시다면 아래의 예에서와 같이 프레임워크에서 제공하는 변환 기능을 사용하여 쉽게 처리 가능합니다.
.. public class TestController extends AnyframeMiPDispatchController { .. public void selectCategoryList(PlatformRequest platformRequest, VariableList inVl, DatasetList inDl, VariableList outVl, DatasetList outDl) throws Exception { // miplatform UI 로 부터 inVl 로 procedure 호출을 위한 입력조건을 받았을 때 - 일반 queryService 호출을 위해 Map 으로 변경 Map inVal = new HashMap(); inVal.put("inCondition", inVl.getValueAsString("inCondition")); // queryService - procedure call Map results = queryService.execute("callCursorTestProcedure", inVal); // CURSOR 타입의 OUT 변수로 지정한 outResults 로 부터 바로 List 형태의 결과를 바로 얻음 List resultList = (List) results.get("outResults"); // dataset 으로 변환 Dataset resultDs = this.convertVoListToDataset("resultDs", resultList, false); if (resultDs == null) { throw new Exception("no data"); } else { outDl.addDataset("ds_access", resultDs); } }2. 실행된 sql 을 바로 얻을 수 있는 방법은 없습니다.
queryService 의 맵핑 xml 에 존재하는 쿼리문을 queryId 기반으로 얻어낼 수는 있습니다.
.. @Resource(name = "sqlLoader") SQLLoader sqlLoader; .. String sql = sqlLoader.getQueryStatement("selectCategoryList");log4jdbc 를 사용한 DB 접속 및 실행 정보를 로깅할 수 있으므로 아래와 같이 log4j 를 통해 수집되는 sql 문을 활용할 수도 있겠습니다. 별도의 FileAppender 나 JDBCAppender 등으로 로그를 재참조할 수 있도록 저장해두고 별도의 프로그램을 통해 바인드변수까지 처리된 해당 시점의 동적 쿼리문을 확인할 수 있습니다.
동시에 여러 client 가 사용하는 경우 원하는 쿼리문의 명확한 한정이 어려울 수도 있겠네요.
.. Log log = LogFactory.getLog("jdbc.sqltiming"); log.info("★start★"); List resultList = (List) queryService.find("selectCategoryList", new Object[] {new Object[] {"param", paramMap } }); log.info("★end★");2009-04-24 19:47:39,562 INFO [jdbc.sqltiming] ★start★ 2009-04-24 19:47:39,671 INFO [jdbc.sqltiming] SELECT * FROM TEST_CATEGORY where 1=1 and CATEGORY_NAME like '%'|| 'food' ||'%' {executed in 15 msec} 2009-04-24 19:47:39,703 INFO [jdbc.sqltiming] ★end★위의 내용에 대해 간단하게 테스트 프로젝트를 만들어 봤습니다. Anyframe 3.2.0 Library 와 miplatform 관련 jar 는 포함하지 않았으며 아키텍처나 여타의 고려없이 기능테스트 용도로 최소 구현하였습니다. 라이브러리를 맞춰 잡으신 후 jdbc.properties 에 본인이 사용 가능한 Oracle 접속 설정으로 바꾸고 CallaleStatementTest 를 JUnit 으로 실행하면 됩니다.
파일 첨부가 잘 안되네요 ^^;;
Its arduous to search out
Its arduous to search out educated folks on this matter, however you sound like you know what youre talking about! Thanks
Solving sudoku unconfused baby games for kids adjuror Gamot na pampalibog stop premature ejaculation with enlast goldenrod