sql >> Base de Datos >  >> RDS >> Oracle

SQL dinámico:compruebe la sintaxis y la semántica

EXPLAIN PLAN comprobará la sintaxis y la semántica de casi todos los tipos de sentencias SQL. Y a diferencia de DBMS_SQL.PARSE no ejecutará nada implícitamente.

El objetivo del plan de explicación es mostrar cómo Oracle ejecutará una declaración. Como efecto secundario de generar el plan, también debe verificar la sintaxis, los privilegios y, en general, hacer todo excepto ejecutar la declaración. El plan de explicación en sí mismo no tiene sentido y puede ignorarse, la declaración solo se ejecuta para verificar si hay errores. Mientras no haya errores, la declaración es válida.

Por ejemplo, los bloques PL/SQL a continuación verifican la validez de un SELECT instrucción y CREATE TABLE declaración. Se ejecutan sin errores, por lo que la sintaxis está bien.

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

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

Ejecutar una declaración incorrecta generará un error. Al menos en este caso de prueba, genera el mismo error que si la sentencia se ejecutara 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

El diagrama de sintaxis en el manual implica que debe ejecutarse para todos declaraciones. Sin embargo, parece haber al menos algunos tipos de declaraciones que no funcionan, como 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

Ligeramente fuera de tema:¿está tratando de crear una interfaz SQL completamente genérica, como un SQL Fiddle privado integrado en PL/SQL? ¿Necesita preocuparse por cosas como evitar que los usuarios intenten ejecutar ciertos tipos de declaraciones y asegurarse de que no haya puntos y comas al final? Si es así, puedo editar la pregunta para ayudar con algunas de esas difíciles tareas dinámicas de SQL.