2014-11-28 2 views
0

В базе данных я конвертерный, я вижу много процедуры, которые выглядят следующим образом:Нет обработка ошибок результата

ALTER PROCEDURE DeleteSomething 
    @someinput 
AS 
    DELETE 
    FROM [table name] 
    WHERE [several conditions are met] 

Затем я вижу эти процедуры называется так:

exec DeleteSomething @someinput 

Однако в этом процессе обработки ошибок не происходит. Я не очень хорошо знаком с T-SQL, поэтому я пытаюсь проверить - что произойдет, если этот запрос упадет? Если он не найдет данных? Если условия не выполняются? Если введенный вход равен нулю?

  1. Я правильно говорю, что в всех этих случаях программа просто будет продолжать в обычном режиме, так как не был проверен @@ ошибка?
  2. Аналогично, если выходной параметр также был передан процедуре, и это не удалось, могу ли я сказать, что оно имеет значение null, поскольку оно не было назначено?

Edit:

Вот еще один пример запроса я пришел scross:

select @variable=field  
from table join othertable on table.id = othertable.id  
where table.id = someinput 

Опять же, нет обработки ошибок. Насколько мне известно, в Oracle, который выдавал бы ошибку, если бы не было обнаружено никаких данных. Правильно ли я говорю в T-SQL, если нет соответствующей переменной @error?

+0

Если условия не соблюдены, и если введенный вход имеет значение null, результат будет равен «0 строк». –

+0

@PareshJ: Вот что я подумал. Может быть, это не был отличный пример. Я добавил редактирование, чтобы показать некоторые другие случаи обработки исключений, которые мне интересны. –

+0

Не так много идеи о ORACLE, но в MSSQL, это определенно не повлияет на запись. –

ответ

0

1: это неверно. когда хранимая процедура вызывается из внешней программы, и что-то пойдет не так на стороне SQL, тогда ошибка вызывается sql. вы видите здесь, что эта ошибка не будет обрабатываться самим sql. вызывающее программное обеспечение может игнорировать его, но ошибка должна быть обработана вызывающим абонентом.
btw пустой набор результатов и неудовлетворенность, если условия не являются ошибкой.

2: не уверен в этом, но не может найти никаких доказательств или документации. если огромная хранимая процедура (сотни строк кода) завершилась с ошибкой после того, как значение уже установлено, выходной параметр может быть не нулевым.

-1

Попробуйте использовать Begin Tran, Commit Tran и Rollback

  1. Первый Начинайте Сделка с BEGIN TRAN
  2. Если некоторые строки были затронуты на основе запроса ниже Begin Tran т.е. если @@ROWCOUNT является >=1 с фиксированием Сделка с использованием COMMIT TRAN
  3. Если есть некоторая ошибка, и строки не пострадали, используйте ROLLBACK для отката ваших транзакций ион

    ALTER PROCEDURE DeleteSomething 
        @someinput 
    AS 
    BEGIN TRAN 
        DELETE 
        FROM [table name] 
        WHERE [several conditions are met] 
    IF @@Trancount>=1 
    Begin 
        COMMIT TRAN 
    End 
    ELSE 
    BEGIN 
        Rollback 
    END 
    IF @@Errorcount<>0 
        ROLLBACK TRAN 
        Declare @ErrMsg Nvarchar(8000),@ErrSeverity int 
        Select @ErrMsg=ERROR_MESSSAGE(),@ErrSeverity=ERROR_SEVERITY() 
        Raiserror(@ErrMsg,@ErrSeverity,1) 
    
+0

Это хороший код, но он не отвечает на вопросы, которые я задал. –

0

Да - вы правы в предположении, что программа будет продолжать работать - не обращая внимания на ошибку. Если оператор (exec) не находится в блоке catch try. Еще одна вещь, которую следует учитывать, это транзакции - это оператор в транзакции.

Что касается второй части вашего вопроса - я (почти) уверен, что выходной параметр останется неизменным до тех пор, пока ему не будет присвоено значение. Другими словами - без конкретного примера, предоставленного вами, вам нужно будет изучить конкретный SP, чтобы узнать, где параметру присваивается значение.

Надеюсь, это вам поможет.

Смежные вопросы