Oracle
 sql >> база данни >  >> RDS >> Oracle

Защо EXECUTE IMMEDIATE е необходимо тук?

Целият PL/SQL блок се анализира по време на компилиране, но текстът в динамичен израз не се оценява до времето на изпълнение. (Те са почти едно и също нещо за анонимен блок, но все пак различни стъпки).

Вашият if/else също не се оценява до времето на изпълнение. Компилаторът не знае, че таблицата винаги ще съществува до момента, в който направите вмъкването, той може само да провери дали съществува или не в момента, в който анализира целия блок.

Ако таблицата вече съществува, тогава всичко е наред; компилаторът може да го види, блокът се изпълнява, вашият избор получава 1 и вие влизате в else, за да направите вмъкването. Но ако не съществува, синтактичният анализ на вмъкването е неуспешен с ORA-00942 по време на компилиране и нищо в блока не се изпълнява.

Тъй като създаването на таблицата е динамично, всички препратки към таблицата също трябва да бъдат динамични - вашето вмъкване, както сте видели, но също и ако след това го направите заявка. По принцип това прави кода ви много по-труден за четене и може да скрие синтактични грешки - тъй като динамичният код не се анализира до момента на изпълнение и е възможно да имате грешка в динамичен израз в клон, който не е уцелван за дълго време.

Глобалните временни таблици така или иначе не трябва да се създават в движение. Те са постоянни обекти с временни данни, специфични за всяка сесия и не трябва да бъдат създавани/изпускани като част от кода на вашето приложение. (По принцип не трябва да се правят промени в схемата от вашето приложение; те трябва да бъдат ограничени до промени в надстройката/поддръжката и да бъдат контролирани, за да се избегнат грешки, загуба на данни и неочаквани странични ефекти; GTT не се различават).

За разлика от временните таблици в някои други релационни бази данни, когато създавате временна таблица в база данни на Oracle, създавате дефиниция на статична таблица. Временната таблица е постоянен обект, описан в речника на данните, но изглежда празна, докато сесията ви не вмъкне данни в таблицата. Вие създавате временна таблица за самата база данни, а не за всяка съхранена процедура в PL/SQL.

Създайте GTT веднъж и направете целия си PL/SQL код статичен. Ако искате нещо по-близо до локалните временни таблици на SQL Server, разгледайте колекциите PL/SQL.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Извикване на pl/sql функция в java?

  2. Oracle SQL заявка:Извличане на най-новите стойности за група въз основа на времето

  3. Брой петъци между две дати

  4. MOD() Функция в Oracle

  5. Уникално ограничение на Oracle и уникален индекс