Perché non possiamo scrivere l'istruzione ddl direttamente nel blocco PL / SQL


11

Perché non possiamo scrivere le istruzioni ddl direttamente nel blocco PL / SQL, ad esempio quando scrivo

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

Ma,

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

Perché il secondo è stato eseguito correttamente?

Risposte:


7

Come dice nella documentazione :

Solo l'SQL dinamico può eseguire i seguenti tipi di istruzioni all'interno delle unità del programma PL / SQL:

  • Istruzioni DDL (Data Definition Language) come CREATE, DROP, GRANT e REVOKE

Un'operazione TRUNCATEè DDL.

Durante l'utilizzo EXECUTE IMMEDIATE, ricorda che qualsiasi DDLoperazione eseguita implicitamente COMMITla transazione corrente.


1

Il DDL nel codice PL / SQL è più un'eccezione che un'esigenza reale. Parse può essere visualizzato come verifica della struttura, che si perde se la struttura cambia durante l'esecuzione. Le procedure devono essere analizzate nuovamente su altri oggetti (tabelle o altro codice pl / sql, viste, ecc.). Ogni volta che l'oggetto cambia, dovrebbe essere ricompilato. Quindi, fare codice analizzato di qualcosa che non cambia struttura non può essere verificato e come tale compilato. Prendi in considerazione il caso

DROP TABLE T1;

Durante il tempo di analisi, la tabella viene trovata e la procedura viene compilata correttamente, ma alla prima esecuzione la tabella viene eliminata e il codice non è più valido (la prossima volta DROP TABLE comporterebbe un errore). Allo stesso modo, qualsiasi modifica alla tabella DDL creerebbe la necessità di ricompilare, perdendo così il vantaggio dell'analisi del codice.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.