인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

blueocean1855님의 프로필 이미지
blueocean1855

작성한 질문수

3. 웹개발 코스 [Enterprise Architecture(EA) X 전자정부프레임워크]

7강 질문드립니다

작성

·

29

0

BEGIN

UPDATE tbl_user

SET userpw = in_userpw

WHERE userid = in_userid;

SET out_state = 0;

SELECT userid, userpw, out_state FROM tbl_user WHERE userid = in_userid;

END

이렇게 작성했을 때는 out_state가 잘 반환이 되는데

UPDATE tbl_user

SET userpw = in_userpw

WHERE userid = in_userid;

SELECT userid, userpw

FROM tbl_user

WHERE userid = in_userid;

SET out_state = 0;

이렇게 작성했을 땐 mapper에서 설정도 out으로 해놨는데도 반환이 안되고 자꾸 null값이 나오는 걸까요??

답변 2

0

개발자Park님의 프로필 이미지
개발자Park
지식공유자

안녕하세요.개발자park입니다.

7강 13:16초에 40번째 Line을 보시면요.

https://www.inflearn.com/course/lecture?courseSlug=%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%BD%94%EC%8A%A4-ea-%EC%A0%84%EC%9E%90%EC%A0%95%EB%B6%80-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC&unitId=155007&tab=curriculum&subtitleLanguage=ko

paramMap변수에 out_state를 Key로 사용해서

값을 저장합니다.

그렇기에 저장 프로시저가 실행된 후의 out_state키의 값을 얻고자하시면

paramMap변수로부터 얻을 수가 있겠습니다.

질문주신 1번째 쿼리는 select문에 포함되기에

강의 41번째 Line의 resultMap변수에서도

out_state키로 값을 얻으실 수 있습니다.

감사합니다.

blueocean1855님의 프로필 이미지
blueocean1855
질문자

네 저도 이렇게 생각해서 진행하고

@Override

public HashMap<String, Object> selectLogin(HttpServletRequest request) throws Exception {

String userid = request.getParameter("id");

if(userid.length()>10) {

throw new Exception("validError_userid");

}

HashMap<String,Object> paramMap = new HashMap<>();

// request 된것을 paramMap에 담아주기

paramMap.put("myid", userid);

paramMap.put("out_state", -1);

HashMap<String,Object> resultMap = mainMapper.selectLogin(paramMap);

System.out.println("Result Map2: " + resultMap);

if(resultMap == null) {

throw new Exception("resultError_idNotFound");

}

return resultMap;

}

여기서 담기는 값이 debug로도 확인이 안되서 이렇게 print를 해보았는데도 해당 방식으로는 out_state에 내용이 담기지 않아서 그 점이 의문이었습니다.

개발자Park님의 프로필 이미지
개발자Park
지식공유자

안녕하세요.개발자park입니다.

질문주신 2번째 쿼리로는 out_state가

System.out.println("Result Map2: " + resultMap);해당 결과에 출력이 안될 것 입니다.(이유:Select문에 포함이 안됨)

java코드의 resultMap변수에서 얻고자하시면 1번째 쿼리를 사용하셔야되고요.

 

질문주신 2번째 쿼리로는

1.HashMap<String,Object> resultMap = mainMapper.selectLogin(paramMap);

코드가 실행된 후에

2.paramMap변수로부터 out_state키의 값을 얻은 후

3.resultMap에 수동으로 키와 값을 넣어줄 수도 있겠습니다.

감사합니다.

 

blueocean1855님의 프로필 이미지
blueocean1855
질문자

아하 set은 되어있는데 그 값을 가져오는 쿼리가 없어서 내용이 안나온거였군요 감사합니다!

0

안녕하세요, 인프런 AI 인턴입니다. blueocean1855님.

Oracle과 MyBatis를 사용할 때, 프로시저 안에서 SELECT문의 결과를 올바르게 반환받기 위해서는 프로시저의 모든 OUT 파라미터가 제대로 설정되고 순서가 정확하게 지켜져야 합니다.

문제의 원인

  • PL/SQL의 흐름 제어 문제: SELECT 문보다 SET out_state = 0; 문이 먼저 수행되지 않는 경우 값이 설정되지 않기 때문입니다. 프로시저 종료 전에 out_state가 정확하게 설정되지 않아 null이 반환될 수 있습니다.
  • 출력 순서 문제: out 변수는 일반적으로 마지막에 결과를 설정하도록 권장됩니다.

해결 방법

  1. 변수 설정 순서 확인:
    • 프로시저 로직 상 out_state를 설정하는 부분(SET out_state = 0;)이 SELECT문 이후에 위치하여서 결과가 Null이 반환될 수 있습니다. out_state를 사용하는 다른 로직보다 앞서서 설정하는 것이 안전합니다.
   BEGIN
     UPDATE tbl_user
     SET userpw = in_userpw
     WHERE userid = in_userid;

     -- Set out_state first
     SET out_state = 0;

     SELECT userid, userpw
     INTO out_userid, out_userpw -- Assuming these are OUTPUT parameters
     FROM tbl_user
     WHERE userid = in_userid;
   END;
  1. INTO 절 사용:

    • Oracle PL/SQL에서 SELECT ... INTO절을 사용하여 조회된 값을 변수에 할당할 수 있습니다. SELECT문에서 INTO절을 꼭 사용하여야 합니다.
  2. Mapper XML 설정 검토:

    • MyBatis Mapper XML에서 결과 맵핑과 프로시저 파라미터 설정을 다시 한번 확인해주세요. OUT 파라미터가 제대로 설정됐는지도 확인이 필요합니다.

관련된 예시와 설정 방법은 다음의 URL에서 확인하실 수 있습니다:
- 프로시저에서 SELECT문 결과를 반환하여 MyBatis와 연동하는 방법

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

blueocean1855님의 프로필 이미지
blueocean1855

작성한 질문수

질문하기