<서론>

프로젝트 중 "java.sql.BatchUpdateException: 업데이트에 대한 결과 집합 이 생성되었습니다." 라는 오류 메시지가 콘솔창에 출력되었다.

처음 사용하는 프레임워크로 프로젝트를 진행하고 있기 때문에 프레임워크 문제인지도 많이 고민했었다.

혼자 고민해보고 이곳저곳 고쳐보다가 제발 있었으면 좋겠다 라는 심정으로 구글링한 결과, 해결책을 찾을 수 있었다.

 

역시 구글은 모든 걸 알고있다.

 

 


 

<본론>

1. sqljdbc4.jar 파일 문제

sqljdbc의 버전에 의해 문제가 발생할 수 있다는 글을 찾았다. 운영도 되고 있는 서비스라 sqljdbc 파일을 변경 후 검증가지 필요하므로 막무가내로 파일을 변경하기에는 조금 무리가 있어 최후의 수단으로 남겨두고 다른 방법을 찾았다.

 

2. 프로시저 내의 "NO COUNT ON"

프로시저의 "NO COUNT ON" 구문이 해당 문제를 야기한다는 글을 찾았다. 프로시저 마지막에서 리턴받을 데이터가 없는 처리용일 때는 해당 명령을 빼주면 오류가 발생하지 않는다고 한다.

일단 내 쿼리는 리턴값이 있었지만, 속는 셈 치고 해당 명령을 주석처리한 결과 오류는 해결되었다.

 

 


 

<결론>

엄밀히 말하면 완벽한 해결은 아니다. 위에 언급했듯이 내 프로시저에서는 리턴값이 있는 프로시저였음에도 위와 같은 오류가 발생했다. 정말 sqljdbc4.jar 파일 문제일 수도 있지만 아직 개발 초보라 NO COUNT ON이 정확히 어떤 명령어인지 파악하지 못했다.

NO COUNT ON 을 좀 더 공부해보고, 내 프로시저에 어떤 문제가 있었는지 분석한 다음 NO COUNT ON에 대한 정리글도 포스팅하겠다.

 

<참고자료>

https://blog.naver.com/PostView.nhn?blogId=lkssky2002&logNo=220477127663&proxyReferer=http%3A%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3D%26esrc%3Ds%26source%3Dweb%26cd%3D1%26ved%3D2ahUKEwjW0v3B05PnAhXMc3AKHYlyBhwQFjAAegQIAxAB%26url%3Dhttp%253A%252F%252Fm.blog.naver.com%252Flkssky2002%252F220477127663%26usg%3DAOvVaw08rR0Nv06OhNtsgJT1y43I

 

[해결]mssql 프로시져 호출시 "업데이트에 대한 결과 집합 이 생성 되었습니다" 오류 발생

java 비즈니스 로직에서 프로시져 호출시 "업데이트에 대한 결과 집합 이 생성 되었습니다" 라는 오류 메세...

blog.naver.com

 

<서론>

프로젝트에서 사용하던 DB가 MSSQL로 되어 있어서 MSSQL을 사용해볼 수 있었다. 그러다보니 문자열을 자르거나, 문자열을 찾거나 하는 등의 처리를 하는 일이 있었는데, 자주 쓰기보다 어쩌다 한 번 나오는 경우라 기억하지 못하고 계속 구글링으로 찾아봤다. 그렇게 계속 찾기엔 귀찮아서 내 블로그에 정리하려 한다. 앞으로는 내 블로그 봐야지 히힛.

 

 


 

<본론>

1. 문자 길이 확인 (LEN, DATALENGTH)

1-1. 글자 수 확인

LEN( string_expression ) / return int
ex) LEN( 'Hello' ) / return 5

하지만 LEN은 자료형이 CHAR, VARCHAR인 경우에 사용할 수 있다(N이 붙어도 가능). 이 점을 잊고 쿼리를 짜다간 깊은 혼란에 빠질 수 있다.

 

1-2. byte 수 확인

DATALENGTH( expression ) / return int
ex) DATALENGTH( 'Hello' ) / return 5

입력 변수에 TEXT나 NTEXT 등도 올 수 있으며 심지어 IMAGE도 가능하다고 한다.

Byte를 체크하기 때문에 한글인 경우에는 글자 수보다 크게 나온다.

 

2. 문자열 자르기(LEFT, RIGHT, SUBSTRING)

2-1. 문자 앞(왼쪽)에서부터 자르기

LEFT( string_expression, integer_expression ) / return (varchar or nvarchar)
ex) LEFT( '123456', 3 ) / return '123'

자르기를 원하는 문자열을 첫번째 파라메터로 넣고, 몇글자 자를 건 지 숫자를 두번째 파라메터로 넣는다.

입력하는 문자열은 varchar, nvarchar, char, nchar 만 가능하다. text나 ntext는 사용할 수 없다.

입력하는 문자열이 유니코드인 문자 데이터 형식인 경우 nvarchar를 return

입력하는 문자열이 유니코드가 아닌 문자 데이터 형식인 경우 varchar를 return

 

2-2. 문자 뒤(오른쪽)에서부터 문자 자르기

RIGHT( string_expression, integer_expression ) / return (varchar or nvarchar)
ex) RIGHT( '123456', 3 ) / return '456'

문자 앞에서부터 자르는 방식과 동일하다.

 

2-3. 중간부터 자르기

SUSBSTRING( expression, start, length ) / return (varchar or nvarchar or varbinary)
ex) SUBSTRING( '123456', 3, 2 ) / return '34'

입력받은 문자열의 중간을 잘라낼 때 사용. 시작값은 0이 아니라 1이다.

입력할 수 있는 데이터 형식은 char, binary, text, image가 가능하다.

입력값의 데이터 형식에 따른 리턴값의 데이터 형식은 다음과 같다.

char, varchar, text / return varchar

nchar, nvarchar, ntext / return nvarchar

binary, varbinary, image / reutnr varbinary

 

3. 숫자형인지 확인(ISNUMERIC)

ISNUMERIC( expression ) / return int
ex) ISNUMERIC( '123456' ) / return 1
ex2) ISNUMERIC('123k456') / return 0

입력한 문자열이 숫자형으로 변환이 가능한 지 확인하는 함수.

입력한 문자열이 숫자형으로 변환이 가능한 경우 1을 불가능한 경우에는 0을 반환한다.

 

4. 문자열 치환(REPLACE)

REPLACE( string_expression, string_pattern, string_replacement ) / return (varchar or nvarchar)
ex) REPLACE( '123456789123', '123', 'test' ) / return 'test456789test'

문자열 치환은 텍스트 에디터에서 쓰는 기능과 동일하다. 다만 하나만 바꾸는 것이 아니라 찾은 패턴은 모두 치환해 버린다.

입력한 문자열이 varchar나 nvarchar의 최댓값을 초과하는 값이라면 반환값을 8,000 byte에서 자른다.

 

5. 문자열 찾기(CHARINDEX, PATINDEX)

CHARINDEX( expression_to_find, expression_to_search [, start_location] ) / return (varchar or bigint or int)
ex) CHARINDEX( '123', '123456789123' ) / return 1
ex2) CHARINDEX( '123', '123456789123', 2) / return 10

처음 입력값을 두번째 입력한 값 내에서 찾고 첫번째 위치를 반환하는 함수. 세번째 입력 값으로 검색하는 위치를 조정할 수도 있다. 찾는 값이 없을 경우, 0을 반환한다.

 

5-1. 패턴 처음 위치

PATINEDX( '%pattern%', expression ) / return (varchar or nvarchar or bigint or int)
ex) PATINDEX( '%123%', '123456789123' ) / return 1
ex) PATINDEX( '123', '123456789123' ) / return 0

CHARINDEX와 비슷하지만 패턴을 LIKE 처럼 찾는다. CHARINDEX와 마찬가지로 찾는 패턴이 없을 경우 0을 반환한다.

 

6. 문자열 끝의 공백 지우기(LTRIM, RTRIM)

6-1. 문자 앞(왼쪽) 공백 지우기

LTRIM( character_expression ) / return (varchar or nvarchar)
ex) LTRIM( '        he llo  ') / return 'he llo  '

문자 앞(왼쪽)에 있는 공백을 제거하는 함수. 문자 끝(오른쪽)이나 중간의 공백은 제거하지 않는다.

 

6-2. 문자 뒤(오른쪽) 공백 지우기

RTRIM( character_expression ) / return (varchar or nvarchar)
ex) LTRIM( '        he llo  ') / return '        he llo')

문자 앞(왼쪽)에 있는 공백을 제거하는 함수. 문자 끝(오른쪽)이나 중간의 공백은 제거하지 않는다.

 

번외. 문자열 어디에 있든 공백을 한꺼번에 지울 땐 REPLACE를 사용

 

7. 공백 넣기(SPACE)

SPACE( integer_expression ) / return varchar
ex) SPACE( 3 ) / return '   '

입력한 숫자만큼 공백을 반환하는 함수. 만약 숫자가 음수라면 Null 을 반환한다.

 

번외. 유니코드 데이터에 공백을 포함하거나 8,000개가 넘는 공백을 반환하려면 SPACE 대신 REPLICATE를 사용

 

8. ASCII 코드 변환(ASCII, CHAR)

ASCII( character_expression ) / return int
CHAR ( integer_expression / return char
ex) ASCII( 'A' ) / return 65
ex2) CHAR( 65 ) / return 'A'

ASCII와 문자로 변환하는 함수.

CHAR와 관련해서는 몇 가지 제어 문자를 삽입할 수 있다.

 

CHAR(9)   : 탭

CHAR(10: : 줄바꿈

CHAR(13) : 캐리지 리턴

 

9. 대소문자 변환(UPPER, LOWER)

UPPER( character_expression ) / return (varchar or nvarchar)
LOWER( character_expression ) / return (varchar or nvarchar)
ex) UPPER( 'AbcdE' ) / return 'ABCDE'
ex2) LOWER( 'AbcdE' ) / return 'abcde'

입력받은 문자열을 모두 대문자 혹은 소문자로 변경하는 함수. 대소문자가 섞여있는 문자열을 비교할 때, 대문자 혹은 소문자로 맞추기 위해 사용하기도 한다.

 

10. 문자 반복(REPLICATE)

REPLICATE( string_expression, integer_expression ) / return (string_expression과 같은 형식)
ex) REPLICATE( '0', 4 ) / return '0000'

원하는 문자열을 원하는 횟수만큼 반복하는 함수. 숫자로 이루어진 데이터의 앞에 원하는 만큼 0을 넣어 자리를 맞춰주는 데 쓰일 수 있다.

 

11. 문자열을 반대로(REVERSE)

REVERSE( string_expression ) / return (varchar or nvarchar)
ex) REVERSE( 'abcdEABcdeFg' ) / return 'gFedcBAEdcba'

입력한 문자열을 거꾸로 반환하는 함수. 대소문자도 당연히 구분한다.

 


 

<결론>

문자열과 관련된 내장함수가 적진 않지만 자주 쓴다면 못 외울 것도 없다. 하지만 이렇게 많은 종류를 어쩌다 한 번씩 쓰니 일일히 외우고 다니기엔 여간 귀찮은 일이 아니다. 그리고 이번 프로젝트가 끝난다면 언제 또 MSSQL을 만나게 될지도 알 수 없다. 오라클 열심히 하자.

 

 

<참고자료>

1. https://docs.microsoft.com/ko-kr/sql/t-sql/language-reference?view=sql-server-ver15

사진 1. 삼성 스페이스 모니터(S32R750Q)

2019년 마지막을 장식할 지름.

공간 활용에 특화되어 있다는 삼성 스페이스 모니터를 지르고 말았다.

9년을 고생한 모니터는 은퇴시키기로 결정하자 32 Inch, QHD 이상의 모니터를 질러보자 라고 생각하던 찰나,

삼성 스페이스 모니터가 특가로 풀려서 지르고 말았다.

생긴 것도 너무 이뻐서, 안살래야 안살 수가 없었다.

 

힌지가 불안하지만, AS의 삼성이니 10년 정도 써도 괜찮겠..

 

 


박스

 

 

사진 2. 스페이스 모니터 박스

박스가 너무 거대해서 놀랐다. 내가 사용했던 모니터들 중 가장 큰 32인치긴 했지만, 박스가 엄청 컸다.

가로로 긴 와이드 모니터도 아니었는데, 모니터 박스가 가로로 무척 길어서 당황했다.

가로로 긴 이유는 모니터 암과 바이스처럼 조이는 부분을 수납하려고 공간을 만들어서 옆으로 긴 것이었다.

실제로 모니터 본체는 한 쪽으로 패키징 되어 있었고 반대쪽은 비어있었다.

AR87 키보드와 마찬가지로 언박싱 사진은 제대로 찍지 못했다.

 

 


간단 사용기

 

조립하는 사진과 설치하는 사진은 찍지 못했다. 영롱한 모니터의 자태에 정신이 홀려 부랴부랴 설치하느라 깜빡했다.

아직 리뷰 포스팅이 부족해서 그런갑다.

 

사진 4. 스페이스 모니터를 가장 위로 올린 상태

조립 및 설치 후기를 글로만 대신해보자면, 우선 조립은 예상한대로 정말 간단했다. 메뉴얼대로만 한다면 큰 문제는 없는 편. 다만 책상에 설치할 때가 걱정이었다. 모니터가 크기에 비해 덜나간다고 해도 무게가 있는 편인데 설치할 때, 고정이 안돼서 애먹지 않을까 걱정했는데, 제일 높게 고정한 상태에서 설치하니 쓰러지는 일은 없었다. 생각보다 설치도 쉬운 편이었다.

 

사진 5. 고정부 하단

유리 위에 설치하는 것이었지만 고정하는 위, 아래 부분 모두에 나름 푹신한 패드가 있어서 유리가 깨질 염려는 없어보인다.

 

사진 6. 스페이스 모니터 측면부

의외로 모니터 두께는 좀 있는 편인데, 베젤이 얇은 편이어서 그런지 크게 신경쓰이진 않는다. 그리고 어차피 정면만 보니 모니터 두께를 의식할 일도 없다.

 

사진 7. 스페이스 모니터 베젤

바깥에 튀어나와있는 정말 얇은 선만 베젤인 줄 알았는데, 안으로도 조금 더 있다. 그래도 무척 얇아서 거의 없는 편.

 

사진 8. 스페이스 모니터를 가장 내렸을 때

스페이스 모니터의 단점이라고 지적하는 것 중 하나는 높이 조절만 할 수는 없다는 것. 모니터 암의 구조상 높이를 내리면 모니터가 사용자에게 가까워질 수 밖에 없고, 높이를 올리면 사용자에게서 멀어질 수 밖에 없다. 이런 점은 확실히 아쉬운 부분이다. 원래 컴퓨터 할 때 자세가 안좋아서 최적의 모니터 거리 같은 건 없는 편인 나에게도 높이를 가장 낮춰서 나와 가깝게 하니 부담스러울 정도로 모니터와 나 사이가 가까워 진 편이었다. 모니터를 책상에 대고 쓸 일은 없으니, 큰 문제까지는 아닌 것 같다.

 

사진 9. 공간 활용을 극대화한 스페이스 모니터

이 모니터는 공간 활용을 극대화 했다는 것이 가장 큰 장점인데, 확실히 모니터를 가장 위로 올리면, 꽤나 많은 자리가 생긴다. 모니터를 책상에 고정하는 부분도 크지 않은 편이고, 책상의 가장 끝에 있어서인지 책상을 사용할 때, 신경쓰이지 않는 정도이다. 확실히 이런 점은 이 모니터의 매력 포인트인 것 같다.

 

 


마치며

 

아직 이 모니터를 진득하게 사용해본 건 아니고, 게임 몇 개 돌려보는 정도로만 사용해봤다. 현재 사용하는 그래픽 카드가 QHD를 144Hz 모두 쏴주긴 조금 벅찬 감이 있어서 평균 110Hz대긴 하지만, 게임에서 아주 만족도 높은 디스플레이를 보여주고 있다.

 

사실 이러니 저러니 해도 생긴게 이뻐서 다 괜찮아.

 

 

<사진 출처>

사진 5. http://news.zum.com/articles/57182095

'취미 > 전자기기' 카테고리의 다른 글

[키보드] ABKO AR87 NAVY 갈축  (0) 2019.12.24

+ Recent posts