sql >> Databáze >  >> RDS >> PostgreSQL

Rozdíl mezi jazykem sql a jazykem plpgsql ve funkcích PostgreSQL

Funkce SQL

... jsou lepší volbou:

  • Pro jednoduché skalární dotazy . Není moc co plánovat, raději si ušetříte režii.

  • Pro jediné (nebo velmi málo) hovory na relaci . Nic nezískáte z cachování plánu prostřednictvím připravených příkazů, které PL/pgSQL nabízí. Viz níže.

  • Pokud jsou obvykle volány v kontextu větších dotazů a jsou dostatečně jednoduché na to, aby byly vložené .

  • Pro nedostatek zkušeností s jakýmkoli procedurálním jazykem, jako je PL/pgSQL. Mnozí znají SQL dobře a to je asi vše, co potřebujete pro funkce SQL. Málokdo může říci totéž o PL/pgSQL. (I když je to docela jednoduché.)

  • Trochu kratší kód. Žádná bloková režie.

Funkce PL/pgSQL

... jsou lepší volbou:

  • Když potřebujete nějaké procedurální prvky nebo proměnné které samozřejmě nejsou dostupné ve funkcích SQL.

  • Pro jakýkoli druh dynamického SQL , kde vytvoříte a EXECUTE prohlášení dynamicky. Zvláštní pozornost je třeba věnovat tomu, aby se zabránilo vkládání SQL. Další podrobnosti:

    • Funkce Postgres vs. připravené dotazy
  • Když máte výpočty které lze znovu použít na několika místech a CTE nelze pro tento účel natáhnout. Ve funkci SQL nemáte proměnné a byli byste nuceni opakovaně počítat nebo zapisovat do tabulky. Tato související odpověď na dba.SE má vedle sebe příklady kódu pro řešení stejného problému pomocí funkce SQL / funkce plpgsql / dotazu s CTE:

    • Jak předat parametr do funkce

Úkoly jsou poněkud dražší než v jiných procedurálních jazycích. Přizpůsobte styl programování, který nepoužívá více přiřazení, než je nutné.

  • Když funkci nelze vložit a je volána opakovaně. Na rozdíl od funkcí SQL lze plány dotazů ukládat do mezipaměti pro všechny příkazy SQL uvnitř funkcí PL/pgSQL; je s nimi zacházeno jako s připravenými prohlášeními , plán se uloží do mezipaměti pro opakovaná volání v rámci stejné relace (pokud Postgres očekává, že plán uložený v mezipaměti (obecný) bude pokaždé fungovat lépe než přeplánování. To je důvod, proč jsou funkce PL/pgSQL obvykle rychlejší v takových případech po prvních pár hovorech.

    Zde je vlákno o výkonu pgsql, které diskutuje o některých z těchto položek:

    • Re:funkce pl/pgsql předčí funkce SQL?
  • Když potřebujete zachytit chyby .

  • Pro spouštěcí funkce .

  • Při zahrnutí příkazů DDL změna objektů nebo změna systémových katalogů jakýmkoli způsobem relevantním pro následující příkazy - protože všechny příkazy ve funkcích SQL jsou analyzovány najednou, zatímco funkce PL/pgSQL plánují a provádějí každý příkaz postupně (jako připravený příkaz). Viz:

    • Proč mohou mít funkce PL/pgSQL vedlejší efekt, zatímco funkce SQL nikoli?

Zvažte také:

  • Výkon uložených procedur PostgreSQL

Chcete-li se skutečně vrátit z funkce PL/pgSQL můžete napsat:

CREATE FUNCTION f2(istr varchar)
  RETURNS text AS
$func$
BEGIN
   RETURN 'hello! ';  -- defaults to type text anyway
END
$func$ LANGUAGE plpgsql;

Existují další způsoby:

  • Mohu zajistit, aby funkce plpgsql vracela celé číslo bez použití proměnné?
  • Příručka „Návrat z funkce“


  1. Dynamický pivot MySQL

  2. Modul Pythonu cx_Oracle modul nebyl nalezen

  3. Pořadí provádění dotazu / klauzule MySQL

  4. PostgreSQL:Vytvořte index pro booleovský sloupec