Oracle
 sql >> Database >  >> RDS >> Oracle

SQL dinamico:controlla la sintassi e la semantica

EXPLAIN PLAN verificherà la sintassi e la semantica di quasi tutti i tipi di istruzioni SQL. E a differenza di DBMS_SQL.PARSE non eseguirà implicitamente nulla.

Il punto del piano di spiegazione è mostrare come Oracle eseguirà un'istruzione. Come effetto collaterale della generazione del piano, deve anche controllare la sintassi, i privilegi e generalmente fare tutto tranne che eseguire effettivamente l'istruzione. Il piano di spiegazione stesso è inutile e può essere ignorato, l'istruzione viene eseguita solo per verificare la presenza di eventuali errori. Finché non ci sono errori, l'istruzione è valida.

Ad esempio, i blocchi PL/SQL sottostanti controllano la validità di un SELECT istruzione e un CREATE TABLE dichiarazione. Funzionano senza errori, quindi la sintassi va bene.

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

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

L'esecuzione di un'istruzione errata genererà un errore. Almeno in questo caso di test, genera lo stesso errore come se l'istruzione fosse stata eseguita da sola.

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

Il diagramma della sintassi nel manuale implica che dovrebbe essere eseguito per tutti dichiarazioni. Tuttavia, sembrano esserci almeno alcuni tipi di istruzioni che non funzionano, come 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

Leggermente fuori tema:stai cercando di creare un'interfaccia SQL completamente generica, come un Fiddle SQL privato integrato in PL/SQL? Devi preoccuparti di cose come impedire agli utenti di tentare di eseguire determinati tipi di istruzioni e assicurarti che non ci siano punti e virgola finali? In tal caso, posso modificare la domanda per aiutare con alcune di quelle difficili attività SQL dinamiche.