작성
·
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입니다.
7강 13:16초에 40번째 Line을 보시면요.
paramMap변수에 out_state를 Key로 사용해서
값을 저장합니다.
그렇기에 저장 프로시저가 실행된 후의 out_state키의 값을 얻고자하시면
paramMap변수로부터 얻을 수가 있겠습니다.
질문주신 1번째 쿼리는 select문에 포함되기에
강의 41번째 Line의 resultMap변수에서도
out_state키로 값을 얻으실 수 있습니다.
감사합니다.
안녕하세요.개발자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에 수동으로 키와 값을 넣어줄 수도 있겠습니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다. blueocean1855님.
Oracle과 MyBatis를 사용할 때, 프로시저 안에서 SELECT문의 결과를 올바르게 반환받기 위해서는 프로시저의 모든 OUT 파라미터가 제대로 설정되고 순서가 정확하게 지켜져야 합니다.
SELECT
문보다 SET out_state = 0;
문이 먼저 수행되지 않는 경우 값이 설정되지 않기 때문입니다. 프로시저 종료 전에 out_state
가 정확하게 설정되지 않아 null이 반환될 수 있습니다.out
변수는 일반적으로 마지막에 결과를 설정하도록 권장됩니다.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;
INTO 절 사용:
SELECT ... INTO
절을 사용하여 조회된 값을 변수에 할당할 수 있습니다. SELECT문에서 INTO
절을 꼭 사용하여야 합니다.Mapper XML 설정 검토:
관련된 예시와 설정 방법은 다음의 URL에서 확인하실 수 있습니다:
- 프로시저에서 SELECT문 결과를 반환하여 MyBatis와 연동하는 방법
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
네 저도 이렇게 생각해서 진행하고
@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에 내용이 담기지 않아서 그 점이 의문이었습니다.