Web/GoLang

[go/golang] SP 프로시저 list 와 ouput parameter 동시에 사용하기

벨포트조던 2021. 7. 28.
반응형

배경

- 내가 필요한건, 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

 

반응형

댓글