관리 메뉴

I LOVE EJ

JTDS 호오.. 요런게 있었나?? 본문

Data Base/Oracle

JTDS 호오.. 요런게 있었나??

BeOne 2007. 10. 15. 17:34

요즘 너무 공부 안한다.


일 핑계, 여가 핑계, 연말 핑계를 대보지만 역시 문제는 내자신이다.


공부 쪼오낸 안해.. ㅡㅡ;


여튼 울 계열사에서 서비스 중인 네비 사이트에 자료 하나를 올렸더니 덩그라니 에러가 나버렸다.


아주 쌩뚱맞은 첨보는 에러..


java.sql.SQLException : [Microsoft][SQLServer 2000 Driver for JDBC]Underlying input stream returned zero bytes

 

호호홍..

 

이건 모시다냐..

 

구글을 열심히 뒤적 뒤적..

 

MS-SQL을 DB로 사용하고 MS에서 제공하는 jdbc driver 삼총사(msutil,jar, msbase.jar, mssqlserver.jar)를 사용할때, TEXT 필드형을 가져올때 null을 가져오면 애가 정신 못차린다는 에러메시지 발견..

 

MS에서 jdbc에 대해 아주 허접한 support를 한다는걸 다시금 각인시키는구나~

 

대안..

 

1) 쿼리를 전부 바꾼다.

SELECT TXT FROM TABLES

위의 TXT는 TEXT형 필드이고 위와같이 했을때 에러가 발생

SELECT TXT=(CASE WHEN DATALENGTH(TXT) = 0 THEN '' ELSE TXT END) FROM TABLES

로 변환(하라는 게시물을 읽음)

그러나 아행행 한게.. 결국 ''도 ZERO BYTES기 때문에 요것도 당근 에러난다.

(이렇게 하라고 갈쳐준 사람들은 당췌 해보긴 한건가?)

어쩔수 없이 한바이트 이상이라도 넘겨주던가(위에 변환쿼리에서 ''을 '1' 로 변경 등)

아니면 형 변환을 해야한다

※ 참고 : 형변환 ==> CONVERT(필드타입, 필드명)


2) open source JTDS를 이용

호오.. 이런게 생겼다니.. 나온진 1년 남짓된 open source인데 MS-SQL, SYBASE를 지원하는 type 4 jdbc driver이다.

약어는 Java Type 4 Driver System????? ( +ㅡ,.-)y=~oO

 

여튼 자세한 사항은 http://jtds.sourceforge.net/ 으로 가면 참고/다운로드 가능하다.

한글은 기대하지도 마시라..

그리고 한글로 번역되거나 설명된 사이트.. 전무..

(개발자들이 점점 귀차니즘이 강해지는 현상인가?)

간단하게 설명하면.. MS에서 제공하는 jdbc driver이외 또다른 driver이다.

(설명 바라.. (ㅡㅡ;; ))

혹시라도 더 많은 설명을 원한다면.. 본인의 영어 실력 향상을 권장한다. ㅡㅡ;

여튼 요 드라이버로 대체후 테스트..

또다시 에러 발생..

java.sql.SQLException : I/O Error: SSO Failed: Native SSPI library not loaded. Check the java.library.path system property.

냐하하.. 이건 몬 소린지..

 

짧은 영어 실력으로 뒤적뒤적~ (괜히 소스에 같이있는 dll도 regsvr32로 등록해 볼라 했다.)

원인은 user/password 값이 없는거네..

결국 connection url을 고치거나 user/password 값을 제대로 입력.

※ 참고 : jtds는 SSO 기능을 지원(ㅡㅡ;)해서 user/password 값이 없으면 윈도우 계정을 가져와서 로그인할라구 시도한다.

 

그리고 페이지를 다시 돌리니 두번째 에러 봉착..

java.sql.SQLException : Output parameter not allowed as argument list prevents use of RPC.

또다시 짧은 영어로 뒤적뒤적.. (ㅠ.ㅠ)

 

JTDS는 Stored Procedure를 호출할때, RPC 모드를 이용해서 호출을 하는데

만약 Output 파라미터가 있는 프로시져에서, 파라미터를 전부 ? 로 하지않고 '{value}', ? 이런식으로 혼용(?)해서 쓰게되면 RPC 호출을 못하게 된다고 한다.

만약 혼용해서 쓰려면 Output 파라미터를 사용하지 않고 섞어쓸 수 있지만 그땐 RPC 모드로 호출하지 않고 프로시져 일반 실행모드(?)로 되어서 RPC모드보다 덜 효과적이다.

 

요건 알아서 적절히 수정요망..

문제는 내가 만든 framework에서 이걸 적용하기 힘든 대상이 있다. (페이징 처리를 템플릿으로 만든 모듈.. ㅡㅡ;)

이건 또 어뜨케 수정하나 쩝..

참고로 위의 메시지에 대한 sourceforge 답변을 원문으로 아래에 같이 첨언했다.

 

Why do I get java.sql.SQLException: "Output parameter not allowed as argument list prevents use of RPC." when calling a stored procedure?

When calling a stored procedure that has output parameters, the driver has to call the procedure using a remote procedure call (RPC). Stored procedures should be invoked using the special JDBC call escape syntax. For example, {call sp_example(?,?)}. In this case the driver will be able to use an RPC succesfully as all the parameters are represented by parameter markers (?). If however parameters are supplied as a mixture of parameter markers and literals, for example {call sp_example('test',?)}, then the driver is unable to use an RPC and therefore cannot return output parameters. In these circumstances the driver raises an exception and execution fails.

It is possible to use mixed parameter lists to call stored procedures that do not have output parameters. In this case the driver will substitute the parameters locally and use a normal "execute procedure" SQL call; however, this mode of execution is less efficient than an RPC.


나태해 지지 말자..

'Data Base > Oracle' 카테고리의 다른 글

오라클 Install - NT상에 오라클 제거.  (0) 2008.08.18
9i부터 svrmgr이랑 internal유저가 없습니다.  (0) 2007.10.15
Insert 테이블  (0) 2007.10.15
오라클 리스너,tnsname구성  (0) 2007.10.15
SYS/SYSTEM/SYSDBA/SYSOPER  (0) 2007.10.15