Два утверждения не являются строго эквивалентными.
Если предположить, что id = 4, первый из них планируется / готовится на каждом проходе и ведет себя так:
prepare dyn_stmt as '... x_function( 4, 25 ) ...'; execute dyn_stmt;
Другой получаетзапланировано / подготовлено только на первом проходе и ведет себя примерно так:
prepare stc_stmt as '... x_function( $1, 25 ) ...'; execute stc_stmt(4);
(Цикл фактически заставит его подготовить курсор к вышеперечисленному, но это не только вопрос ради нас.)
Ряд факторов может привести к тому, что оба результата дадут разные результаты.
- Изменения пути поиска до вызова процедуры будут игнорироваться при втором вызове.В частности, если это заставляет
x_table
указывать на что-то другое. - Постоянные всех видов и вызовы неизменяемых функций являются «жестко привязанными» в плане второго вызова.
Рассмотримэто как иллюстрация этих побочных эффектов:
deallocate all;
begin;
prepare good as select now();
prepare bad as select current_timestamp;
execute good; -- yields the current timestamp
execute bad; -- yields the current timestamp
commit;
execute good; -- yields the current timestamp
execute bad; -- yields the timestamp at which it was prepared
Почему эти два не возвращают одинаковые результаты в вашем случае, будет зависеть от контекста (вы разместили только часть своей функции pl / pgsql, поэтомуТрудно сказать), но я думаю, что вы столкнулись с вариантом вышеупомянутой проблемы.