как создать временную функцию в postgresql?

<p>я должен выполнить цикл в базе данных. это только одноразовое требование. после выполнения функции, я сейчас отбрасываю функцию.</p><p>есть ли хороший подход для создания временных/одноразовых функций?</p>

<p>мне нужно было знать, как многократно использовать сценарий, который я писал. оказывается, вы можете создать временную функцию, используя схему pg\_temp. это схема, которая создается по требованию для вашего соединения и где хранятся временные таблицы. когда ваше соединение закрыто или истекает, эта схема удаляется. оказывается, если вы создадите функцию на этой схеме, схема будет создана автоматически. следовательно,</p><pre><code>create function pg\_temp.testfunc() returns text as $$ select 'hello'::text $$ language sql; </code></pre><p>будет функция, которая будет держаться до тех пор, пока ваше соединение остается. не нужно вызывать команду сброса.</p>

<p>пара <strong> дополнительных примечаний </strong> к <a href="https://stackoverflow.com/a/9981540/939860">умный трюк в ответе @ crowmagnumb</a> :</p><ul> <li>функция должна быть <strong> квалифицированной по схеме </strong> всегда, даже если <code>pg\_temp</code> находится в <code>search\_path</code> (как это есть по умолчанию), <a href="https://www.postgresql.org/message-id/15191.1208975632@sss.pgh.pa.us">согласно том лейн</a> для предотвращения троянских коней:</li> </ul><pre><code>create function <b>pg\_temp.</b>f\_inc(int) returns int as 'select $1 + 1' language sql immutable; select pg_temp.f_inc(42); f_inc ----- 43  функция, созданная во временной схеме, видна только в <strong> том же сеансе </strong> (так же, как временные таблицы). это невидимо для всех других сессий (даже для той же роли). вы  можете  получить доступ к функции в качестве другой роли в том же сеансе после set role.   вы даже можете создать функциональный индекс на основе этой "временной" функции: create index foo_idx on tbl (pg_temp.f_inc(id));  тем самым создается простой индекс с использованием временной функции для невременной таблицы. такой индекс будет виден всем сеансам, но будет действителен только для сеанса создания. планировщик запросов не будет использовать функциональный индекс, где выражение не повторяется в запросе. еще немного подвох. когда сеанс будет закрыт, он будет автоматически удален как зависимый объект. чувствуется, что это не должно быть позволено вообще ...  если вам просто нужно многократно выполнять функцию и все, что вам нужно, это sql, рассмотрите подготовленный оператор <a href="https://www.postgresql.org/docs/current/static/sql-prepare.html"><strong> </strong> . он действует так же, как  временная функция sql , которая умирает в конце сеанса. не то же самое  , и может использоваться только с execute, не вложенным в другой запрос. пример:prepare upd_tbl as update tbl t set set_name = $2 where tbl\_id = $1; </code></pre><p>вызов:</p><pre><code>execute upd\_tbl(123, 'foo\_name'); </code></pre><p>подробности:</p><ul> <li> <a href="https://stackoverflow.com/questions/28018991/split-given-string-and-prepare-case-statement/28220532#28220532">разбить заданную строку и подготовить оператор case</a> </li> </ul>

<p>если вы используете версию 9.0, вы можете сделать это с помощью новой инструкции do:</p><p> <a href="http://www.postgresql.org/docs/current/static/sql-do.html">http://www.postgresql.org/docs/current/static/sql-do.html</a> </p><p>в предыдущих версиях вам нужно будет создать функцию, вызвать ее и снова отбросить.</p>