2013-09-25 3 views
0

В моем пакете SP содержатся инструкции DELETE и INSERT INTO. Если DELETE-оператор успешен, но INSERT INTO не делает, JAVA будет смотреть только на первый оператор и пришел к выводу, что весь SP был успешно выполнен, что может быть неправильным.JAVA вызов хранимой процедуры с оператором удаления и вставки

Как я могу выполнить более одного оператора и получить исключение в JAVA, если только один из операторов завершился с ошибкой. Я был опробован с помощью TRY-CATCH в SQL, но все закончилось, что оператор all был выполнен правильно, потому что первый оператор был успешным.

Это является MS SQL 2008 Database

ALTER PROCEDURE [testing] 
    @bikes varchar(8000), 
    @groupw varchar(4), 
    @name char(6) 

AS 
BEGIN 


     DELETE CP_customer_kngr_corr_s WHERE knid in ('blue') 

     DECLARE @pos INT 
     DECLARE @len INT 
     DECLARE @value varchar(8000) 

     set @pos = 0 
     set @len = 0 
     set @bikes= @bikes +',' 

     WHILE CHARINDEX(',', @bikes, @pos)>0 BEGIN 
      set @len = CHARINDEX(',', @bikes, @pos+1) - @pos 
      set @value = SUBSTRING(@bikes, @pos, @len) 

      INSERT INTO [bikes] 
       ([bikes]) 
      VALUES 
       (@value) 

      set @pos = CHARINDEX(',', @bikes, @[email protected]) +1 
     END 
END 
+0

Что вы подразумеваете под _ «JAVA будет смотреть только на первое утверждение и заключить, что весь SP был успешно выполнен» _? Вы, вероятно, неправильно интерпретируете результаты. Пожалуйста, покажите, как вы вызываете процедуру с Java, и как вы заключаете, что был выполнен только первый оператор. Вероятно, вам нужно добавить 'SET NOCOUNT ON' в вашу хранимую процедуру или вам нужно перебрать ** все ** результаты, возвращаемые драйверу JDBC. –

ответ

1

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

//Perform delete 
select @@ROWCOUNT 

if @@ROWCOUNT = 0 
    //RAISE ERROR 

BEGIN TRY 
//perform insert here 
END TRY 
BEGIN CATCH 
DECLARE @ErrorMessage NVARCHAR(4000); 
DECLARE @ErrorSeverity INT; 
DECLARE @ErrorState INT; 

SELECT @ErrorMessage = ERROR_MESSAGE(), 
     @ErrorSeverity = ERROR_SEVERITY(), 
     @ErrorState = ERROR_STATE(); 

-- Use RAISERROR inside the CATCH block to return 
-- error information about the original error that 
-- caused execution to jump to the CATCH block. 
RAISERROR (@ErrorMessage, -- Message text. 
      @ErrorSeverity, -- Severity. 
      @ErrorState -- State. 
      ); 

END CATCH; 

проверить также состояние ошибки, возвращенное ERROR_STATE перед передачей его в качестве значения для параметра состояния из RAISERROR

Приветствий !!

+0

Когда я делаю то, что вы предлагаете, он работает как аспектный, если я вызываю SP на SQL-сервере. Он возвращает таблицу с «ошибкой» или «успехом». Но мой JAVA говорит, что он не возвращает результат, потому что он возвращает первый оператор DELETE. – boje

+0

com.microsoft.sqlserver.jdbc.SQLServerException: оператор не возвращал результирующий набор. – boje

+0

В чем заключается основная ошибка обмена сообщениями, произошел ли какой-либо сбой при удалении или вставке? –

1

Какую базу данных это? В большинстве баз данных вы можете выполнить RAISEERROR, когда операция завершится с ошибкой. Это приведет к выбросу JDBCException.

Вы можете проверить, удалось ли вставить, проверив @@ rowcount. Если количество произведенных строк равно нулю, вам может потребоваться исключение.

http://technet.microsoft.com/en-us/library/ms187316.aspx

+0

Это база данных MS SQL 2008. Я знаю, что RAISEERRROR работает в этом видении. Но как бы вы переписывали СП? – boje

+0

, вы можете использовать @@ rowcount для отслеживания, если вставка выполнена успешно. –

0

Проблема в моем SP заключалась в том, что SET NOCOUNT ON; не был установлен. Там он возвращает, что удаление было успешным, а не оператором SELECT.

Вот конечный результат.

ALTER PROCEDURE [testing] 
    @bikes varchar(8000), 
    @groupw varchar(4), 
    @name char(6) 

AS 
BEGIN 
    SET NOCOUNT ON; 

     DELETE CP_customer_kngr_corr_s WHERE knid in ('blue') 

     DECLARE @pos INT 
     DECLARE @len INT 
     DECLARE @value varchar(8000) 

     set @pos = 0 
     set @len = 0 
     set @bikes= @bikes +',' 

     WHILE CHARINDEX(',', @bikes, @pos)>0 BEGIN 
      set @len = CHARINDEX(',', @bikes, @pos+1) - @pos 
      set @value = SUBSTRING(@bikes, @pos, @len) 

      INSERT INTO [bikes] 
       ([bikes]) 
      VALUES 
       (@value) 

      set @pos = CHARINDEX(',', @bikes, @[email protected]) +1 
     END 
END 
Смежные вопросы