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

Динамичен SQL - Проверете синтаксиса и семантиката

EXPLAIN PLAN ще провери синтаксиса и семантиката на почти всички видове SQL изрази. И за разлика от DBMS_SQL.PARSE няма да изпълни нищо имплицитно.

Целта на плана за обяснение е да покаже как Oracle ще изпълни израз. Като страничен ефект от генерирането на плана той трябва също така да проверява синтаксиса, привилегиите и като цяло да прави всичко, освен действителното изпълнение на оператора. Самият план за обяснение е безсмислен и може да бъде игнориран, изразът се изпълнява само за проверка за грешки. Докато няма грешки, твърдението е валидно.

Например PL/SQL блоковете по-долу проверяват валидността на SELECT оператор и CREATE TABLE изявление. Те работят без грешка, така че синтаксисът е наред.

begin
    execute immediate 'explain plan for select * from dual';
end;
/

begin
    execute immediate 'explain plan for create table just_some_table(a number)';
end;
/

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

begin
    execute immediate 'explain plan for select * from this_table_does_not_exist';
end;
/
ORA-00942: table or view does not exist
ORA-06512: at line 2

Синтаксичната диаграма в ръководството предполага, че трябва да работи за всички изявления. Изглежда обаче, че има поне няколко типа оператори, които не работят, като ALTER SESSION .

begin
    execute immediate 'explain plan for alter session set optimizer_features_enable = ''11.2.0.4''';
end;
/
ORA-00900: invalid SQL statement
ORA-06512: at line 2

Малко извън темата - опитвате ли се да изградите напълно общ SQL интерфейс, като частен SQL Fiddle, изграден в PL/SQL? Трябва ли да се тревожите за неща като предотвратяване на опитите на потребителите да изпълнят определени типове изрази и гарантиране, че няма завършващи точки и запетая? Ако е така, мога да редактирам въпроса, за да помогна с някои от тези трудни динамични 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. Как да върнете списък с поддържани територии в Oracle

  2. Как да продължа цикъла while след изключение, повдигнато в SQL

  3. използвайки pl/sql, как да отворя директория?

  4. spool към .csv файл с помощта на for цикъл

  5. Oracle 10g - Escape цитат в израза за вмъкване