www.manualy.net
logo
Originální stránky pro originální lidi. Výrobky chráněných dílen
Google

MySQL prakticky – uživatelské proměnné

1.6. 2008 Vebloud MySQL

MySQL umožňuje ukládat si hodnoty do proměnných, pracovat s nimi a jednoduše je přenášet mezi výrazy a dotazy.

Vlastnosti uživatelských proměnných

Uživatelsky definované proměnné jsou specifické pro každé spojení. To znamená, že je v každém spojení musíme definovat a jsou použitelné pouze v tomto spojení a při ukončení spojení jsou vymazány.

Proměnné lze v dotazu použít kdekoliv, kde je povolen výraz. Respektive nelze je použít na místech, kde je předepsán literál. Což je vlastnost, která ne vždy potěší. Například v klauzuli LIMIT by bylo použití proměnných velice užitečné, ale LIMIT vyžaduje jako parametry literály a tudíž není možné proměnné použít. Stejně tak IGNORE N LINES z příkazu LOAD DATA vyžaduje literál.

Názvy proměnných

Název proměnné je vždy ve tvaru @my_var přičemž „my_var“ může obsahovat alfanumerické znaky z nastavené znakové sady a znaky: „. , _$ “.

Název může obsahovat i jiné znaky, ale musí být „odcitován“ (lepší překlad slova quote mě nenapadá) např. @'my-var', @"my-var", @`my-var`.

Názvy proměnných jsou do verze 5 citlivé na velikost písmen a od verze 5 (včetně) výše nikoliv.

Inicializace a přiřazení do proměnné

Jedna možnost jak nastavit hodnotu je pomocí příkazu SET, vypůjčím si příklad z manuálu k MySQL (1):

SET @var_name: = expr [, @var_name: = expr]…

Výsledek výrazu, kterým zadáváme hodnotu proměnné, musí být integer, real, string nebo NULL. Nicméně pokud je proměnná částí výsledku vráceného klientovi, je vrácena jako řetězec.

Další možnost je nastavit proměnnou v některém jiném příkazu pomocí operátoru := . Opět si vypůjčím příklad z manuálu k MySQL (1):

SET @t1=0, @t2=0, @t3=0;
SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;

Pokud proměnná není inicializována, má „hodnotu“ NULL a typ String.

Pokud přiřazujete bitové hodnoty, chovají se jako řetězce. Pokud chcete, aby se chovali jako čísla, používejte funkci CAST().

Příklad:
SET @v1 = b'1000001', @v2 = CAST(b'1000001' AS UNSIGNED);
SELECT @v1, @v2;
+------+------+
| @v1  | @v2  |
+------+------+
| A    |   65 | 
+------+------+

Pořadí vyhodnocování a jeho důsledky

V příkazu SELECT se každý výraz vyhodnocuje až, když je posílán ke klientovi. To znamená, že v klauzulích ORDER BY, HAVING nebo GROUP BY nelze používat proměnné nastavované v stejném SELECTU. Například:

SELECT (@aa:=id) AS a, (@aa+3) AS b FROM tbl_name HAVING b=5;

Nebude fungovat podle očekávání, protože „b“ v klauzuli HAVING je pouze alias k výrazu ve výčtu sloupců příkazu SELECT, který používá proměnnou @aa. Tento příkaz nefunguje podle očekávání, protože @aa obsahuje id předchozího nikoliv současného řádku.

Pořadí vyhodnocování výrazů není definováno a může se měnit na základě toho, jak vypadá dotaz. V dotazu SELECT @a, @a := @a+1, ... by bylo celkem logické předpokládat, že se jako první vyhodnotí @a a potom teprve přiřazení. Ale změna dotazu (například přidání, GROUP BY, HAVING nebo ORDER BY klauzule) může změnit pořadí vyhodnocování.

Základní pravidlo pro použití uživatelských proměnných je:

„Nikdy nepřiřazuj hodnotu proměnné v jedné části příkazu, když chceš stejnou proměnnou použít jinde v tomtéž příkazu.“

Teoreticky můžete dostat očekávaný výsledek, ale nikdo vám to nezaručí.

Použití proměnné jako identifikátoru

Proměnná nemůže být použita přímo jako identifikátor nebo jeho část. To znamená, že nemůžeme obsah proměnné použít přímo jako název sloupce či tabulky.

Toto se většinou obchází skládáním dotazů na straně klienta databáze, ale je technika jak na to přímo v databázi. Modním názvem této techniky je Dynamic SQL. Ale o tom někdy příště.

Zdroje

MySQL. 8.4. User-Defined Variables. MySQL 5.0 Reference Manual

Napište váš názor na článek.