Ciao,
premetto che sono concetti molto ampi e quindi vanno approfonditi, ma cercherò di sintetizzare, sperando di riuscire ad evidenziare le differenze "concettuali" utilizzando un linguaggio molto semplice:
- SQL
Acronimo che sta per Structured-Query-Language ed è il linguaggio per l'iterazione "classica" con il DB. Lo stesso viene suddiviso in:
- DML (Data Manipulation Language)
Rappresentano le istruzioni di accesso e manipolazione dei dati negli oggetti esistenti dello schema (DELETE, INSERT, LOCK TABLE, MERGE, SELECT, UPDATE, ...)
- DDL (Data Definition Language)
Creazione/modifica/cancellazione delle strutture (CREATE TABLE, CREATE INDEX, ALTER TABLE, DROP VIEW, ...)
- TCL (Transaction Control Language)
Comandi per la gestione delle transazioni (COMMIT, ROLLBACK, SAVEPOINT)
PL/SQL
È il linguaggio procedurale del DBMS Oracle (PL sta per Procedural ) ed è quindi un vero è proprio linguaggio di programmazione.
Il concetto centrale di PL/SQL è il "blocco" (in inglese block) che viene suddiviso in:
- Anonimus Block
Un blocco anonimo contiene delle istruzioni che vengono eseguite all’interno di un’applicazione o in modo interattivo senza essere memorizzato (stored) nello schema del DB. Esempio:
DECLARE
definizione variabili, costanti, cursori, ecc...
BEGIN
logica del blocco
EXCEPTION
gestione delle eccezioni
END;
/
- Named (o Stored) Block
Si tratta di blocchi PL/SQL precompilati che vengono memorizzati nel database (Procedure, Function, Trigger, ecc ...).
Di seguito un esempio di Procedure
CREATE PROCEDURE nome_procedura
IS {or AS} -- la clausola IS sostituisce DECLARE
definizioni;
BEGIN
corpo_procedura;
EXCEPTION
gestione delle eccezioni
END;
/
La procedura creata potrà essere richiamata in altri blocchi utilizzandone il nome.
Come accennato sopra, PL/SQL è un vero è proprio linguaggio di programmazione (a differenza di SQL) ed è quindi possibile utilizzare:
Controllo condizionale (es. IF-ELSE IF-ELSE-END IF)
Controllo iterativo (es. LOOP, FOR LOOP)
SQL DINAMICO
Il Dynamic SQL consente di utilizzare codice SQL prodotto run time.
Provo a fare un esempio molto semplice (giusto per afferrare il concetto anche se la procedure di esempio non avrà un senso di utilizzo) per evideziare la differenza tra SQL e Dynamic SQL:
supponiamo di dover effettuare la DROP di una tabella.
DROP TABLE T;
Per poterlo fare con codice SQL hai necessità di conoscere il nome della tabella già in fase di scrittura del codice, ma se dovessi cancellare una tabella all'interno di una procedura ma il nome della tabella viene passato, per esempio, con un parametro?
In questo caso ci viene in aiuto il Dynamic SQL:
CREATE PROCEDURE CANCELLA_TABELLA (table_name IN VARCHAR2)
AS
sql_istr VARCHAR2(100);
BEGIN
sql_istr := 'DROP TABLE ' || table_name;
EXECUTE IMMEDIATE (sql_istr );
EXCEPTION
gestione delle eccezioni
END;
/
Come si può vedere, l'istruzione SQL sarà generata run time (durante l'esecuzione della procedura) e nel momento in cui scriviamo il codice non conosciamo ancora il nome della tabella da eliminare.
Sarà poi possibile utilizzare la procedura in altri blocchi:
BEGIN
CANCELLA_TABELLA ('T');
CANCELLA_TABELLA ('T_2');
END;
/
Come dicevo all'inizio, sono concetti che vanno approfonditi, ma spero di essere riuscito a toglierti qualche dubbio.