[Seasar-user:5457] [S2Dao]Sybase のストアドプロシージャ実行時に FetchSize が指定されているとエラーになる

Masayuki Tanaka [E-MAIL ADDRESS DELETED]
2006年 12月 14日 (木) 11:00:14 JST


お世話になります、田中です。

SybaseのストアドプロシージャをS2Dao経由で実行する際に、
jdbc.diconにて、ConfigurableStatementFactoryを使用すると下記に添付したよ
うな例外が発生してしまいます。

素のJDBC呼び出しと比較して調査したところ、
CallbleStatementのsetFetchSizeを指定していると、SybaseのJDBCドライバがプ
ロシージャがResultSetを返却するものと想定して、
「at com.sybase.jdbc2.tds.TdsCursor.open(TdsCursor.java:186)」
を実行しようとするが、実際のプロシージャはResultSetを返さないために、例外
が発生しているようです。

当面は、
・FetchSizeを指定しない
または
・BasicStatementFactoryを使用する
で回避しています。

しかし、対象のアプリケーションにて大量の結果を返すSELECTが存在することも
あり、プロシージャの呼び出し以外のSQL実行にはFetchSizeを指定できるような
方法を模索しております。

S2Daoのソースを見た感じでは、StatementFactoryのcreateCallableStatementは
、プロシージャの呼び出し時に使われていないようでしたので、
ConfigurebleStatementFactoryのcreateCallableStatementから、fetecSizeの指
定を除いたクラスを作成すれば、
・ストアドプロシージャの実行時にはfetchSizeはしていされない
・自動生成されたSQLやsqlファイルに実行時にはcreatePreparedStatementが使わ
れるのでfetchSizeが指定される
と考えているのですが、このような理解で問題ないでしょうか?


また、その他の解決方法等がありましたらご教示願います。

よろしくお願いします。




---------------エラー発生時のStackTrace-------------------
com.sybase.jdbc2.jdbc.SybSQLException: Execute cursor 'jconnect_implicit_4'
is declared on a procedure which contains a non-SELECT or a SELECT with a
COMPUTE clause. For the declaration of this cursor to be legal it should
have a single SELECT statement without a COMPUTE clause.

	at com.sybase.jdbc2.tds.Tds.processEed(Tds.java:2416)
	at com.sybase.jdbc2.tds.Tds.nextResult(Tds.java:1852)
	at com.sybase.jdbc2.tds.Tds.getResultSetResult(Tds.java:2328)
	at com.sybase.jdbc2.tds.TdsCursor.open(TdsCursor.java:186)
	at
com.sybase.jdbc2.jdbc.SybCallableStatement.sendRpc(SybCallableStatement.java:405)
	at
com.sybase.jdbc2.jdbc.SybCallableStatement.execute(SybCallableStatement.java:121)
	at
org.seasar.dao.handler.ProcedureHandlerImpl.execute(ProcedureHandlerImpl.java:38)
	at
org.seasar.dao.handler.AbstractBasicProcedureHandler.execute(AbstractBasicProcedureHandler.java:107)
	at
org.seasar.dao.impl.StaticStoredProcedureCommand.execute(StaticStoredProcedureCommand.java:30)
	at
org.seasar.dao.interceptors.S2DaoInterceptor.invoke(S2DaoInterceptor.java:53)
	at
jp.co.isid.actress.web.sptest.dao.CreteNEXDao$$EnhancedByS2AOP$$120dbf3$$MethodInvocation$$execSpYenLineUpdateNCDCP3.proceed(MethodInvocationClassGenerator.java)
	at
org.seasar.extension.tx.NotSupportedInterceptor.invoke(NotSupportedInterceptor.java:38)
	at
jp.co.isid.actress.web.sptest.dao.CreteNEXDao$$EnhancedByS2AOP$$120dbf3$$MethodInvocation$$execSpYenLineUpdateNCDCP3.proceed(MethodInvocationClassGenerator.java)
	at
org.seasar.framework.aop.interceptors.ClassLoaderAwareTraceInterceptor.invoke(ClassLoaderAwareTraceInterceptor.java:41)
	at
jp.co.isid.actress.web.sptest.dao.CreteNEXDao$$EnhancedByS2AOP$$120dbf3$$MethodInvocation$$execSpYenLineUpdateNCDCP3.proceed(MethodInvocationClassGenerator.java)
	at
jp.co.isid.actress.web.sptest.dao.CreteNEXDao$$EnhancedByS2AOP$$120dbf3.execSpYenLineUpdateNCDCP(CreteNEXDao$$EnhancedByS2AOP$$120dbf3.java)
	at
jp.co.isid.actress.sptest.dao.CreteNEXDaoTest.test004Tx(CreteNEXDaoTest.java:39)




Seasar-user メーリングリストの案内