#sql #stored-procedures #firebird
#sql #хранимые процедуры #firebird
Вопрос:
У меня есть Firebird StoredProc, запускаемый из триггера перед вставкой и перед обновлением, а также возвращающий 3 значения. Эти 3 значения обновляют 3 поля непосредственно в одной таблице
Я поставил проверку в начале SP, если проверка верна, я хочу пропустить этот SP, поэтому я использовал «приостановить» и «Выйти», но когда я это сделал, я обнаружил, что 3 поля обновляются с нулевым значением. почему это ?
Триггер:
CREATE OR ALTER trigger trig1 for table1
active before insert or update position 2
AS
begin
execute procedure my_proc1 new.f1, new.f2
RETURNING_VALUES new.f3, new.f4, new.f5;
end
StoredProc (он очень большой, я ставлю только первые строки):
begin
if (COALESCE(Param1,0) = 1) then begin
output1 = 0;
output2 = 0;
output3 = 0;
exit;
end
Даже если я удалил блок IF и сохранил все остальное, я не получаю нулей в 3 полях, кроме NULL !!!. Пожалуйста, сообщите
Спасибо
Ответ №1:
Поскольку вы недостаточно опубликовали хранимую процедуру, трудно сказать, но похоже, что вы смешиваете выбираемые и исполняемые процедуры, что не рекомендуется. Т.Е. если вы вызываете SP через EXECUTE PROCEDURE
, которого у вас не должно быть SUSPEND
в нем, если у вас есть, то вызовите его через SELECT ... FROM SP
. FireBird более строг в этом отношении в последних версиях, хотя я думаю, что он не вызывает исключения, если вы используете «неправильный механизм вызова»…
В любом случае, если вы вызываете EXIT
выбираемый SP, он устанавливает SQLCODE равным 100 (конец потока записей), т.Е. он не устанавливает выходные значения. Итак, я предлагаю вам «очистить» свой SP, либо сделать его выбираемым (иметь SUSPEND
в местах, где вы хотите возвращать значения, и вызывать его через SELECT
оператор), либо сделать его исполняемым (избавиться от SUSPEND
операторов в нем и вызвать его через EXECUTE
).