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 задачи.