sql >> Databáze >  >> RDS >> Oracle

Proč nemohu použít proměnné vazby v příkazech DDL/SCL v dynamickém SQL?

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 napsal USING '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 || '''';
    



  1. Kontrola neodeslané pošty na serveru SQL Server (T-SQL)

  2. *ALERT* Nelze otevřít žádnou další chybu databází s Microsoft Office build 2201

  3. Připojení PHP se nezdařilo:SQLSTATE[HY000] [2002] Připojení odmítnuto

  4. Jak zobrazit plán provádění dotazů v Azure Data Studio (SQL Server)