Pro definici SQL dotazu lze použít všechny vlastnosti použité databáze s několika modifikacemi.
-
tabulky je třeba pojmenovat
-
nesmíte použít klauzuli ORDER BY - dotaz se následně vkládá do jiného pro potřeby řazení a stránkování
Na použité třídy v dotazu se lze odkazovat přímo (zapsání DataRow a ID dané třídy). Tento zápis je ovšem nepřenosný na jiné instance systému ObjectGears a uživatelsky nekomfortní. Proto přednostně používejte druhý zápis:
select * from {{: class.__kod_tridy__ :}} tab
select * from {{: query.__kod_dotazu__ :}} query
select * from {{: model.__kod_modelu__.class.__kod_tridy__ :}} tab
První příklad vloží třídu ze stejného modelu jako je vlastní dotaz. Druhý příklad vloží dotaz ze stejného modelu. Třetí příklad umožňuje vložit třídu z jiného modelu.
Použitou třídu nebo dotaz je třeba explicitně pojmenovat (v příkladu je název tab a query), jinak dojde k chybě při uložení dotazu.
Dále můžete v dotazu použít níže uvedené příkazy. Ty vkládají aktuální ID objektu. Nemusíte tak do sql zadávat konkrétní ID z jedné instance, což by bránilo přenositelnosti. Příkazy nepoužívejte pro skládání názvů použitých tabulek, ale např. pro vrácení ID jako součásti dat.
{{: model.__kod__.id :}}
{{: class.__kod__.id :}}
{{: query.__kod__.id :}}
{{: class.__kod__.column.__kod_sloupce__.id :}}
{{: query.__kod__.column.__kod_sloupce__.id :}}
select id, {{: class.ukol.id :}} parentId
from {{: class.ukol :}} u
Parametrizace dotazu
V dotazu můžete použít příkazy, které jsou při vlastním spuštění nahrazeny aktuální hodnotou. Dotaz tak lze lehce přizpůsobit aktuálnímu kontextu. Příkazy se zadávají do dvojitých závorek, ale bez dvojteček.
Následující příklady načtou záznamy ze třídy "akce", kde je hodnota ve sloupci "adminid", resp. "adminname" rovna aktuálně přihlášenému uživateli. Výsledná hodnota příkazu je text. Proto musí být vložen do apostrofů.
select * from {{: class.akce :}} a where adminid = {{ LoginUser.Id }}
select * from {{: class.akce :}} a where adminname = '{{ LoginUser.FullName }}'
Příkaz |
Popis |
LoginUser.Id |
Příkaz vloží ID aktuálně přihlášeného uživatele. |
LoginUser.FullName |
Příkaz vloží celé jméno aktuálně přihlášeného uživatele. |
LoginUser.Account |
Příkaz vloží účet aktuálně přihlášeného uživatele. |
LoginUser.Code |
Příkaz vloží kód aktuálně přihlášeného uživatele. |
LoginUser.Email |
Příkaz vloží email aktuálně přihlášeného uživatele. |
Návratová hodnota příkazu LoginUser.Id je celé číslo, zatímco ostatní příkazy LoginUser... vrací text. Proto je třeba tyto příkazy uzavřít do apostrofů. Jinak při vykonávání SQL příkazu databází dojde k chybě.
Dotaz s těmito parametry můžete použít na webu nebo pro webové služby. Nemůžete však pro něj vytvořit v databázi view pomocí funkce Vytvoření API view. V databázi totiž není dostupná informace o aktuálním uživateli.
Dotaz s WITH
V dotazu nemůžete normálně použít příkaz WITH. Musíte tento "poddotaz" vložit do jiného pomocného dotazu a na něj se opakovaně odkázat.
V dotazu tedy nemůžete použít ani rekurzivní volání. Při jeho potřebě použijte jako zdroj dotazu uloženou proceduru.
Důvodem je obalení Vašeho dotazu jiným dotazem pro řazení, stránkování a správné pojmenování sloupců, které přidává systém ObjectGears. Příkaz WITH můžete použít, jen pokud použijete i příkaz /*ENDWITH*/.
Příklad použití:
WITH ArticleTopic(first_article_id, article_id, parent_article_id, topic_id, Level)
AS
(
...
)
/*ENDWITH*/
select ...
from ...
Příkaz /*ENDWITH*/ vložte hned za část WITH a před klauzuli SELECT.