Firebird SQL: StoredProc возвращает null вместо присвоенных значений

#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 ).