Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

SQL dinâmico - Verifique a sintaxe e a semântica


EXPLAIN PLAN verificará a sintaxe e a semântica de quase todos os tipos de instruções SQL. E ao contrário de DBMS_SQL.PARSE ele não executará nada implicitamente.

O objetivo do plano de explicação é mostrar como o Oracle executará uma instrução. Como um efeito colateral de gerar o plano, ele também deve verificar a sintaxe, os privilégios e geralmente fazer tudo, exceto executar a instrução. O plano de explicação em si é inútil e pode ser ignorado, a instrução é executada apenas para verificar se há erros. Desde que não haja erros, a declaração é válida.

Por exemplo, os blocos PL/SQL abaixo verificam a validade de um SELECT instrução e um CREATE TABLE declaração. Eles são executados sem erros, então a sintaxe é boa.
begin
    execute immediate 'explain plan for select * from dual';
end;
/

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

A execução de uma instrução incorreta gerará um erro. Em pelo menos um caso de teste, ele gera o mesmo erro como se a instrução fosse executada sozinha.
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

O diagrama de sintaxe no manual indica que deve ser executado para todos declarações. No entanto, parece haver pelo menos alguns tipos de instrução que não funcionam, 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

Um pouco fora do tópico - você está tentando construir uma interface SQL completamente genérica, como um SQL Fiddle privado construído em PL/SQL? Você precisa se preocupar com coisas como impedir que os usuários tentem executar certos tipos de instrução e garantir que não haja ponto e vírgula à direita? Nesse caso, posso editar a pergunta para ajudar com algumas dessas difíceis tarefas dinâmicas do SQL.