둘러보기 생략.
 

procedure 결과값 가져오기

1. 프로시져의 결과값을 리스트형태로 가져올수 있는지 알고 싶습니다.
mi의 dataset으로 받을수 있는지 알고 싶습니다.
예제가 있다면 예제도 부탁드려요

2. 쿼리 서비스에서 실행된 sql을 화면쪽으로 리턴시키고 싶습니다.
조건값들을 매핑시킨 sql자체를 화면으로 리턴시킬수 있는지

첨부 파일날짜파일 크기조회수최근 다운로드
queryservice-test.zip2009-04-24155.83 KB232 주 2 일 전

원하는 답변이 될지 모르겠습니다 ^^

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");
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 으로 실행하면 됩니다.
파일 첨부가 잘 안되네요 ^^;;

It’s arduous to search out

It’s arduous to search out educated folks on this matter, however you sound like you know what you’re talking about! Thanks
Solving sudoku unconfused baby games for kids adjuror Gamot na pampalibog stop premature ejaculation with enlast goldenrod