PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Защо функциите PL/pgSQL могат да имат страничен ефект, докато SQL функциите не могат?

Вие сами сте удебелили основното изречение в ръководството:

Цялото тяло на SQL функция се анализира, преди която и да е от тях да бъде изпълнена.

Прочетете също за Стадия на анализатора в ръководството.

Състои се от две основни части:парсер и процеса на трансформация . Цитирайки ръководството:

процесът на трансформация взема дървото, предадено обратно от синтактичния анализатор, като вход и прави семантичната интерпретация, необходима, за да се разбере кои таблици, функции и оператори се препращат от заявката.

Ако SQL функция съдържа следните команди:

CREATE TABLE foo (...);
INSERT INTO foo VALUES(...);

И двете изявления се планират практически по едно и също време (въз основа на една и съща моментна снимка на системните каталози). Следователно, INSERT не може да види таблицата "foo", вероятно създадена с предишния CREATE команда. Това създава един от следните проблеми :

  1. Ако няма други таблица с име "foo" във вашия search_patch (все още), Postgres се оплаква когато се опитва да създаде функцията:

    ERROR:  relation "foo" does not exist
    
  2. Ако друга таблица с име "foo" вече съществува във вашия search_patch (и не използвате противоречиви имена на колони), Postgres ще планира INSERT въз основа на тази вече съществуваща таблица. Обикновено това води до грешка по време на изпълнение , ако някакви стойности причиняват конфликти в (грешната!) таблицата. Или, с малко късмет, може дори да пише в тази таблица без съобщение за грешка! Много подъл бъг.

Това не може да се случи с PL/pgSQL функция, защото третира SQL командите като подготвени изрази, планирани и изпълнени последователно . Така всеки израз може да види обекти, създадени в предишни оператори.

Следователно, изрази, които никога не се посещават, никога дори не се планират - за разлика от SQL функциите. А планът за изпълнение на изразите може да се кешира в рамките на същата сесия - също за разлика от SQL функциите. Прочетете подробности за кеширането на план във функциите PL/pgSQL в ръководството тук.
Всеки подход има предимства за някои случаи на употреба. Допълнително четене:

  • Разлика между език sql и език plpgsql във функциите на PostgreSQL


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Таблица като аргумент на функция на PostgreSQL

  2. Заявка за елемент от масив в колона JSON

  3. Как използвате скриптови променливи в psql?

  4. Заявка за брой различни стойности в подвижния период от време

  5. Как мога да получа psycopg2 регистриране на времето за изпълнение на заявка?