Tutte le clausole SQL possono essere eseguite in ambiente interattivo per mezzo del SQL monitor, comunque per la realizzazione di applicazioni complesse è necessario inserire le clausole SQL in un programma scritto in linguaggio procedurale, al fine di fruire sia delle possibilità del SQL come linguaggio non procedurale, sia delle possibilità di un linguaggio procedurale, con particolare riguardo al controllo dei flussi e alla comunicazione con il sistema operativo.
Esistono due modalità per l'inserimento delle clausole SQL in un linguaggio procedurale: embedded SQL e dynamic SQL.
La definizione "embedded SQL" si riferisce all'uso di clausole SQL inserite in un linguaggio di programmazione procedurale, queste clausole sono di due tipi:
1. tutte le clausole SQL, DML e DDL
2. comandi che hanno la funzione di effettuare l'integrazione ed il controllo del flusso delle clausole SQL all interno del linguaggio di programmazione procedurale (CONNECT, DECLARE, OPEN, FETCH, etc.)
A titolo di esempio si riporta uno schema di massima per l'esecuzione di una clausola SELECT, con modalità embedded in linguaggio ospite C, per la restituzione di x t-uple con 1<=x<=n.
1. Definizione nella DECLARE SECTION delle variabili ospiti utilizzate dal SQL.
2. Assegnazione dei valori in input alle variabili ospiti.
3. Indirizzamento alla funzione di error-handler e nella eventualità di errore: messaggio diagnostico, ricerca di un eventuale successivo errore, chiusura del cursore ed esecuzione del ROLLBACK WORK.
4. Dichiarazione di un cursore per lo statement-name (SQL DECLARE cursor-name FOR statement-name) per la clausole SELECT.
5. Indirizzamento alla funzione notfound e nel caso di nessuna ulteriore t-upla riscontrata: output del totale delle t-uple processate, chiusura del cursore ed esecuzione della direttiva COMMIT WORK.
6. Esecuzione dei cicli di FETCH per il cursore dichiarato, eventuale terminazione degli array di char ed output delle t-uple processate.
7. Esecuzione della direttiva COMMIT WORK.
La tecnica definita dynamic SQL che, diversamente dall'uso di clausole SQL note al momento della compilazione, non prevede l'inserimento embedded del codice SQL, ma la sua acquisizione run time generata da programma o letta da un qualsiasi dispositivo di input.
I programmi che sono in grado di accettare e processare clausole SQL definite dinamicamente sono caratterizzati da una maggiore versatilità rispetto a quelli che utilizzano la tecnica embedded SQL, per contro richiedono una maggiore complessità di codifica, l'uso di speciali strutture dati ed un maggior tempo di esecuzione, consentono però, grazie alla loro flessibilità open-end, di mantenere indefiniti fino al momento dell'esecuzione del processo: il testo della clausola SQL, il numero ed i tipi delle variabili ospiti ed i riferimenti agli oggetti del database.
Esistono quattro gradi di complessità nell'uso del dynamic SQL a cui corrispondono quattro metodi per la strutturazione del modulo di programma che lo utilizza, i metodi con grado di complessità maggiore sono comprensivi di quelli di grado minore, comunque ciascun metodo possiede una specifica efficienza per il tipo di istruzione per cui è strutturato.
I quattro metodi, definiti in base al tipo di clausola SQL sono:
1. Nonquery senza variabili ospiti in input.
2. Nonquery con un numero conosciuto di variabili ospiti in input.
3. Query con un numero conosciuto di colonne "selected-list" e variabili ospiti in input.
4. Query con un numero non conosciuto di colonne "selected-list" o variabili ospiti in input.