Oracle
 sql >> Base de données >  >> RDS >> Oracle

Dynamic SQL - Vérifier la syntaxe et la sémantique

EXPLAIN PLAN vérifiera la syntaxe et la sémantique de presque tous les types d'instructions SQL. Et contrairement à DBMS_SQL.PARSE il n'exécutera rien implicitement.

Le but du plan d'explication est de montrer comment Oracle exécutera une instruction. En tant qu'effet secondaire de la génération du plan, il doit également vérifier la syntaxe, les privilèges et généralement tout faire sauf exécuter réellement l'instruction. Le plan d'explication lui-même est inutile et peut être ignoré, l'instruction n'est exécutée que pour vérifier d'éventuelles erreurs. Tant qu'il n'y a pas d'erreurs, la déclaration est valide.

Par exemple, les blocs PL/SQL ci-dessous vérifient la validité d'un SELECT et une instruction CREATE TABLE déclaration. Ils s'exécutent sans erreur donc la syntaxe est correcte.

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'exécution d'une instruction incorrecte générera une erreur. Dans au moins ce cas de test, il génère la même erreur que si l'instruction était exécutée par elle-même.

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

Le diagramme de syntaxe du manuel implique qu'il doit s'exécuter pour tous déclarations. Cependant, il semble y avoir au moins quelques types d'instructions qui ne fonctionnent pas, comme 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

Légèrement hors sujet - essayez-vous de créer une interface SQL complètement générique, comme un SQL Fiddle privé construit en PL/SQL ? Avez-vous besoin de vous soucier de choses comme empêcher les utilisateurs d'essayer d'exécuter certains types d'instructions et vous assurer qu'il n'y a pas de points-virgules à la fin ? Si c'est le cas, je peux modifier la question pour vous aider dans certaines de ces tâches SQL dynamiques difficiles.