Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 jdbc: SQLServerException: Индекс 3 находится вне диапазона, хранимка, дефолтные параметры  [new]
basinilya
Member

Откуда:
Сообщений: 41
хранимая процедура, дефолтные параметры, com.microsoft.sqlserver.jdbc, CallableStatement
Подскажите, как правильно делать вызов хранимки с дефолтными параметрами. Адаптировал под MSSQL код, взятый отсюда, не получилось.
package foo.test_jdbc_sqlserver;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.Types;

public class TestDefaultParameters extends AbstractSQLServerTestCase {

	static final String PROCNAME = "testDefaultParams";
	static final String CREATEPROC = "if object_id('"+PROCNAME+"') is null exec( 'create proc [" + PROCNAME + "] as')";
	static final String ALTERPROC = ""
		+ "alter proc [" + PROCNAME + "]" + "\n"
		+ "     @a    float = 5.0," + "\n"
		+ "     @b    float = 4.0," + "\n"
		+ "     @c    float out" + "\n"
		+ "as" + "\n"
		+ "set @c = @a + @b" + "\n"
		+ "" + "\n"
		;
	static final String DROPPROC = "drop proc [" + PROCNAME + "]";

	public void testDefaultParameters() throws Exception {
		Connection cnn = dataSource.getConnection();
		
		try {
			cnn.createStatement().execute(CREATEPROC);
			cnn.createStatement().execute(ALTERPROC);
		
//			String sqlCall = "{call "+PROCNAME+"(?,?,?)}";
//			CallableStatement cstmt = cnn.prepareCall(sqlCall);
//			cstmt.setFloat("a", 5.0f);

			String sqlCall = "{call "+PROCNAME+"(?,?)}"; // 2 params for 3 args
			CallableStatement cstmt = cnn.prepareCall(sqlCall);
//			cstmt.setFloat("a", 5.0f);

			cstmt.setFloat("b", 4.0f);
			cstmt.registerOutParameter("c", Types.FLOAT); // <-- Exception!!!
			cstmt.execute();
			float c = cstmt.getFloat(3);
			assertEquals(9.0f, c);
		} finally {
			try {
				cnn.createStatement().execute(DROPPROC);
			} catch(Exception e) {}
		}
	}
}
7 авг 11, 17:01    [11082651]     Ответить | Цитировать Сообщить модератору
 Re: jdbc: SQLServerException: Индекс 3 находится вне диапазона, хранимка, дефолтные параметры  [new]
basinilya
Member

Откуда:
Сообщений: 41


К сообщению приложен файл (test-jdbc-sqlserver.zip - 7Kb) cкачать
7 авг 11, 17:04    [11082655]     Ответить | Цитировать Сообщить модератору
 Re: jdbc: SQLServerException: Индекс 3 находится вне диапазона, хранимка, дефолтные параметры  [new]
basinilya
Member

Откуда:
Сообщений: 41
Если раскоментировать недостающий параметр, вот, что пишет профайлер:
declare @p1 int
set @p1=1
declare @p6 float
set @p6=9
exec sp_prepexec @p1 output,N'@P0 float,@P1 float,@P2 float OUTPUT',N'EXEC testDefaultParams @P0,@P1,@P2 OUT                    ',5,4,@p6 output
select @p1, @p6
Несмотря на то, что я указываю имя параметра в setFloat(String parameterName, float x), оно не попадает в EXEC. Надо, чтобы было так:
EXEC testDefaultParams @a=@P0,@b=@P1,@c=@P2 OUT
7 авг 11, 17:29    [11082703]     Ответить | Цитировать Сообщить модератору
 Re: jdbc: SQLServerException: Индекс 3 находится вне диапазона, хранимка, дефолтные параметры  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
basinilya,

В вызове хп не указывайте параметр.

CREATE PROCEDURE #T
 @a float = 5.0,
 @b float = 4.0,
 @c float out
AS BEGIN
set @c = @a + @b
END
GO
DECLARE @cout float

EXEC #T  @c =@cout output

SELECT @cout

EXEC #T  @a = 3, @c =@cout output
SELECT @cout

EXEC #T  @a = 3, @b = default, @c =@cout output

SELECT @cout

GO

DROP PROCEDURE #T
GO
7 авг 11, 18:42    [11082841]     Ответить | Цитировать Сообщить модератору
 Re: jdbc: SQLServerException: Индекс 3 находится вне диапазона, хранимка, дефолтные параметры  [new]
basinilya
Member

Откуда:
Сообщений: 41
Отвечаю сам себе: с этим драйвером нельзя.
Поэтому вместо {CALL придётся использовать EXEC
8 авг 11, 13:03    [11085281]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить