V příkazech DDL nejsou povoleny proměnné vazby. Následující příkazy tedy způsobí chyby:
-
Příklad č. 1:Příkaz DDL . Způsobí ORA-01027:vázání proměnných není povoleno pro operace definice dat
EXECUTE IMMEDIATE 'CREATE TABLE dummy_table ( dummy_column NUMBER DEFAULT :def_val )' USING 42;
-
Příklad č. 2:Příkaz DDL . Způsobí ORA-00904::neplatný identifikátor
EXECUTE IMMEDIATE 'CREATE TABLE dummy_table ( :col_name NUMBER )' USING var_col_name;
-
Příklad č. 3:Prohlášení SCL . Způsobí ORA-02248:neplatná možnost pro ALTER SESSION
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_CALENDAR = :cal' USING var_calendar_option;
Problém
Abychom pochopili, proč k tomu dochází, musíme se podívat na Jak se zpracovávají dynamické příkazy SQL.
Aplikační program obvykle vyzve uživatele k zadání textu příkazu SQL a hodnot hostitelských proměnných použitých v příkazu. Poté Oracle analyzuje příkaz SQL. To znamená, že Oracle prozkoumá příkaz SQL, aby se ujistil, že dodržuje pravidla syntaxe a odkazuje na platné databázové objekty. Součástí analýzy je také kontrola přístupových práv k databázi , rezervování potřebných zdrojů a nalezení optimální přístupové cesty.
Důraz přidal odpovědný pracovník
Pamatujte, že krok analýzy proběhne před navázání jakýchkoli proměnných na dynamický příkaz. Pokud prozkoumáte výše uvedené čtyři příklady, zjistíte, že neexistuje způsob, jak by analyzátor zaručil syntaktickou platnost těchto dynamických příkazů SQL, aniž by znal hodnoty pro proměnné vazby.
- Příklad č. 1 :Analyzátor nemůže zjistit, zda bude hodnota vazby platná. Co když místo
USING 42
, programátor napsalUSING 'forty-two'
? - Příklad č. 2 :Parser nemůže zjistit, zda
:col_name
by byl platný název sloupce. Co kdyby byl název vázaného sloupce'identifier_that_well_exceeds_thirty_character_identifier_limit'
? - Příklad č. 3 :Hodnoty pro
NLS_CALENDAR
jsou zabudovány v konstantách (pro danou verzi Oracle?). Parser nemůže zjistit, zda bude mít vázaná proměnná platnou hodnotu.
Odpověď tedy zní, ženemůžete svázat prvky schématu, jako jsou názvy tabulek, názvy sloupců v dynamickém SQL. Stejně tak nemůžete svázat vestavěné konstanty .
Řešení
Jediným způsobem, jak dosáhnout dynamického odkazování na prvky/konstanty schématu, je použít řetězení řetězců v dynamických příkazech SQL.
-
Příklad č. 1:
EXECUTE IMMEDIATE 'CREATE TABLE dummy_table ( dummy_column NUMBER DEFAULT ' || to_char(42) || ')';
-
Příklad č. 2:
EXECUTE IMMEDIATE 'CREATE TABLE dummy_table (' || var_col_name || ' NUMBER )';
-
Příklad č. 3:
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_CALENDAR = ''' || var_calendar_option || '''';