Por que não podemos escrever a instrução ddl diretamente no bloco PL / SQL

11

Por que não podemos escrever instruções ddl diretamente no bloco PL / SQL, por exemplo, quando eu escrevo

CREATE OR REPLACE PROCEDURE test IS
BEGIN
    truncate table table_name; // error
END test;
/

Mas,

CREATE OR REPLACE PROCEDURE test IS
BEGIN
    execute immediate 'truncate table table_name'; // works fine
END test;
/

Por que o segundo foi executado com sucesso?

Ravi
fonte

Respostas:

7

Como diz a documentação :

Somente SQL dinâmico pode executar os seguintes tipos de instruções nas unidades de programa PL / SQL:

  • Instruções DDL (Data Definition Language), como CREATE, DROP, GRANT e REVOKE

Uma TRUNCATEoperação é DDL.

Ao usar EXECUTE IMMEDIATE, lembre-se de que quaisquer DDLoperações executadas implicitamente implicarão COMMITa transação atual.

Philᵀᴹ
fonte
1

DDL dentro do código PL / SQL é mais exceção do que a necessidade real. O Parse pode ser visto como verificação de estrutura, que será perdida se sua estrutura for alterada na execução. Os procedimentos devem ser analisados ​​novamente em outros objetos (tabelas ou outro código pl / sql, visualizações etc.). Cada vez que o objeto for alterado, ele deverá ser recompilado. Portanto, criar código analisado de algo que não seja a estrutura de mudança não pode ser verificado e, como tal, compilado. Considere caso

DROP TABLE T1;

Durante o tempo de análise, a tabela seria encontrada e o procedimento compilado com êxito, mas na 1ª execução, a tabela é descartada e seu código não é mais válido (da próxima vez, DROP TABLE resultaria em erro). Da mesma forma, qualquer alteração na tabela DDL criaria a necessidade de recompilar, perdendo a vantagem da análise de código.

igr
fonte