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

Jsou PL/pgSQL a SQL v PostgreSQL obě na stejné úrovni jako standard SQL/PSM, nikoli pouze jako standard SQL?

Pro ujasnění terminologie:

SQL je dotaz jazyk, který se používá k výběru, aktualizaci, mazání nebo vytváření dat v relační databázi. Nemá žádné procedurální prvky jako smyčky (PRO , WHILE ) nebo podmíněné příkazy (IF , JINA ) nebo proměnné nebo kurzory.

VYTVOŘIT FUNKCI je skutečně „příkaz SQL“, ale je pouze „obalem“ pro specifikaci bloku kódu, který je vykonáván něčím jiným než „enginem“ dotazu SQL. Postgres (na rozdíl od jiných DBMS) podporuje více "runtime enginů", které mohou spustit blok kódu, který byl předán příkazu "CREATE FUNCTION" - jedním z artefaktů je, že kód je ve skutečnosti řetězec, takže CREATE FUNCTION vidí pouze řetězec, nic jiného.

Protože SQL nemá žádné procedurální prvky, nemůžete kombinovat procedurální kód a kód SQL. Pokud chcete spustit procedurální kód, musíte serveru sdělit, že nějak přepínáte „motory“. To se provádí pomocí (SQL) DO příkaz, který opět vezme řetězec, se kterým neví, co má dělat, odešle ho na server a řekne "zde je část kódu, kde uživatel tvrdil, že motor 'xyz' může spustit" - xyz je buď PL/pgSQL, Python, Perl nebo něco úplně jiného.

Je to stejné jako anonymní blok PL/SQL v Oracle, který začínáte DECLARE - vše poté spouští jiný runtime modul na serveru. MySQL žádnou takovou funkci nemá. Jediný způsob, jak spustit procedurální kód, je vytvořit proceduru (nebo funkci) a poté ji spustit. Proto neexistuje nic takového jako DO v MySQL.

Jediný produkt DBMS, který jasně nerozlišuje mezi procedurálním kódem a „prostým SQL“, je SQL Server:T-SQL je rozšíření jazyka SQL, které vám umožňuje kombinovat „běžný SQL“ a procedurální SQL, aniž byste backendu řekli, že kód potřebuje ke svému běhu jiný engine (což je zdrojem velkého zmatku pro lidi, kteří migrují ze serveru SQL Server na Postgres nebo Oracle).

SQL/PSM je standard, který definuje procedurální prvky, které lze vložit do databázového stroje, který používá SQL jako svůj dotazovací jazyk. Nevím o žádném produktu DBMS, který by skutečně implementoval SQL/PSM. Postgres' PL/pgSQL, Oracle's PL/SQL, procedurální dialekt MySQL jsou tomu trochu podobné, ale zdaleka nejsou v souladu se standardem SQL/PSM. Myslím, že nejblíže standardu SQL/PSM je DB2 a možná HSQLDB

To je pravda. Ale pak ne DBMS plně implementuje standard SQL – implementace Postgresu je však pravděpodobně nejblíže standardu.



  1. Jak mohu získat hodnoty z jedné tabulky do druhé pomocí podobných hodnot?

  2. MySQL:Všechny tabulky jsou v pořádku, ale stále ERROR 1577 (systémové tabulky používané Plánovačem událostí byly nalezeny poškozené)

  3. Spustit SQL Trigger pouze tehdy, když konkrétní uživatel aktualizuje řádek

  4. Jak mohu vytvořit instanci Profiled DataAdapter pro použití s ​​MVC MINI PROFILER?