Невозможно выполнить хранимую процедуру с использованием Java и JDBC на сервере SQL - PullRequest
1 голос
/ 13 ноября 2009

Я пытался выполнить хранимую процедуру MS SQL Server через JDBC сегодня и до сих пор безуспешно. Хранимая процедура имеет 1 входной и 1 выходной параметр. С каждой комбинацией, которую я использую при настройке вызова хранимой процедуры в коде, я получаю сообщение о том, что хранимая процедура не может быть найдена. Я предоставил хранимую процедуру, которую выполняю ниже (ПРИМЕЧАНИЕ: это код поставщика, поэтому я не могу его изменить).

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO


ALTER PROC [dbo].[spWCoTaskIdGen] 
@OutIdentifier int OUTPUT
AS

BEGIN
DECLARE @HoldPolicyId int
DECLARE @PolicyId char(14)

IF NOT EXISTS
(
SELECT *
FROM UniqueIdentifierGen (UPDLOCK)
)
INSERT INTO UniqueIdentifierGen VALUES (0)

UPDATE UniqueIdentifierGen 
SET 
    CurIdentifier = CurIdentifier + 1

SELECT @OutIdentifier = 
    (SELECT CurIdentifier
    FROM UniqueIdentifierGen)
END

Код выглядит так:

 CallableStatement statement = connection
            .prepareCall("{call dbo.spWCoTaskIdGen(?)}");
    statement.setInt(1, 0);
    ResultSet result = statement.executeQuery();

Я получаю следующую ошибку: SEVERE: не удалось найти хранимую процедуру 'dbo.spWCoTaskIdGen'.

Я тоже пробовал

    CallableStatement statement = connection
            .prepareCall("{? = call dbo.spWCoTaskIdGen(?)}");
    statement.registerOutParameter(1, java.sql.Types.INTEGER);
    statement.registerOutParameter(2, java.sql.Types.INTEGER);
    statement.executeQuery();

Приведенные выше результаты приводят к: SEVERE: не удалось найти хранимую процедуру 'dbo.spWCoTaskIdGen'.

Я также пробовал:

    CallableStatement statement = connection
            .prepareCall("{? = call spWCoTaskIdGen(?)}");
    statement.registerOutParameter(1, java.sql.Types.INTEGER);
    statement.registerOutParameter(2, java.sql.Types.INTEGER);
    statement.executeQuery();

Приведенный выше код привел к следующей ошибке: Не удалось найти хранимую процедуру spWCoTaskIdGen.

Наконец, я должен также указать на следующее:

  1. Я использовал инструмент MS SQL Server Management Studio и смог успешно запустить хранимую процедуру. SQL, созданный для выполнения хранимой процедуры, представлен ниже:

    GO
    DECLARE @return_value int;
    DECLARE @OutIdentifier int;
    EXEC @return_value = [dbo].[spWCoTaskIdGen] @OutIdentifier = @OutIdentifier OUTPUT;
    SELECT
        @OutIdentifier [@OutIdentifier],
        @return_value [Return Value];
    GO
    
  2. Выполняемый код выполняется с тем же идентификатором пользователя, который использовался в пункте № 1 выше.

  3. В коде, который создает объект Connection, я записываю, к какой базе данных я подключаюсь, и код подключается к правильной базе данных.

Есть идеи?

Заранее большое спасибо.

Ответы [ 4 ]

1 голос
/ 13 ноября 2009

Скорее всего, один из ...

  1. Используемые учетные данные не имеют прав для запуска кода. Вам понадобится GRANT EXECUTE в приведенном выше сценарии

  2. Неверная база данных. Например, сохраненный процесс был создан в master, но вы подключены к «MyDB»

0 голосов
/ 01 февраля 2011

Вы пытались изменить свой Java-код, чтобы использовать "exec" вместо "call"? То есть:

CallableStatement statement = connection
                    .prepareCall("{exec dbo.spWCoTaskIdGen(?)}");
0 голосов
/ 13 ноября 2009

Попробуйте без указания владельца dbo.:

CallableStatement statement = connection.prepareCall("? = spWCoTaskIdGen(?)");
statement.registerOutParameter(1, java.sql.Types.INTEGER);
statement.registerOutParameter(2, java.sql.Types.INTEGER);
statement.executeQuery();

Кроме того, и это длинный снимок, вы уверены, что находитесь в правильной базе данных на сервере базы данных?

0 голосов
/ 13 ноября 2009

Поскольку он не может даже найти процедуру, я сначала посмотрю, чтобы убедиться, что ваш пользователь имеет права на выполнение этой процедуры. Вы можете попробовать выполнить процедуру с тем же пользователем из такого инструмента, как Squirrel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...