배경
- 내가 필요한건, go에서 SP로 호출시, select 리스트와 ouput 파라미터 두개를 한 프로시저로 받고 싶다
- 기존 코드에는 다중 output 프로시저는 있는데, 위와같이 list, ouput이 함께 리턴받을 수 있는 코드가 없었음
문제점
기존 mssql 클라이언트는 https://github.com/denisenkom/go-mssqldb 라이브러리를 사용하고 있어서, 이걸로 어떻게든 해결했어야 했음
이 문서는 자세하진 않지만 그래도 방법이 나와있긴 했음 ( 그러나 안됨 )
var account = "abc"
_, err := db.ExecContext(ctx, "sp_RunMe",
sql.Named("ID", 123),
sql.Named("Account", sql.Out{Dest: &account}),
)
요런식으로 sql.name 에 넣어서 사용하라고 하는데, 몇번을 요리조리 해봐도 절대 안됨
위에꺼 돌려보면 대충 이런 메시지가 나옴
"파라미터 0개를 넣어야 되는데, 2개가 들어옴" ( 다시 에러발생시키기 귀차늠.. 정확한 메시지 아님 )
기존에는 이렇게 "?" 물음표만 가능함, 위 처럼 @로 파싱이 안됨
var account = "abc"
_, err := db.ExecContext(ctx, "EXEC sp_RunMe @id=? @id2=?",
id,
id2,
)
어떻게 지랄해봐도 @로 파싱은 안됨
( 이렇게 처리한분 있으면 방법좀 알려주세요 ㅠㅜㅜ )
해결
결국 공식 문서에 있는 방법으로는 포기
다른 동료가 찾아서 알려줌
사용하려는 프로그램 SP 돌려보면, 아래와 같이 결과값이 2개가 나오는걸 한번에 받는게 필요하다
if rows.Next() {
err = rows.Scan(&test,&test)
}
if !rows.NextResultSet() {
return nil, fmt.Errorf("mssql FindPasswordResetUser 에러.(expected more result sets : %v)", rows.Err())
}
if rows.Next() {
err = rows.Scan(totalCount)
}
방법은 위 코드처럼 NextResultSet를 사용하면 된다
위 캡처를 예를 들어 설명하자면,
첫번째로, 리스트를 row.Next 로 맵핑시키는 작업을 한다
두번째로, nextResultSet 을 사용하고
세번쨰로, 다음 totalcount 를 맵핑시킨다
이렇게 여러 조회문을 사용하는 프로시저에서 사용이 가능하다...
알려준 분이 이거 참고하란다
https://golang.org/src/database/sql/example_test.go
나는 그래도 공식문서 처럼 @로 맵핑시키고 싶은데, 방법있으면 좀 알려주길 바란다.
참고문서
아래 문서들에서 방법을 알려주는데, 난 적용이 안된다
https://github.com/denisenkom/go-mssqldb/issues/78
https://github.com/golang/go/issues/18079
https://stackoverflow.com/questions/45208654/sqlx-go-output-parameter-in-stored-procedure
'Web > GoLang' 카테고리의 다른 글
Go SQL error “converting NULL to string is unsupported” (0) | 2021.07.28 |
---|---|
Golang 구조체 설명 (1) | 2021.07.28 |
[Go/Golang] 구조체 JSON 변환 시, omitempty가 적용되지 않는 경우 (0) | 2021.07.28 |
[Golang] Json 데이터를 파싱할때 자동으로 형변환까지 한번에 하는 방법 (0) | 2021.07.28 |
[Golang] 튜토리얼 웹에서 go 실행 (0) | 2021.07.28 |
댓글