Compilazione di un programma Embedded SQL
Poiché un programma embedded SQL contiene una combinazione di istruzioni SQL e linguaggio host, non può essere inviato direttamente a un compilatore per il linguaggio host. Viene invece compilato tramite un processo a più passaggi. Anche se questo processo è diverso da prodotto a prodotto, i passaggi sono approssimativamente gli stessi per tutti i prodotti.
Questa figura mostra i passaggi necessari per compilare un programma embedded SQL.
Sono cinque i passaggi coinvolti nella compilazione di un programma embedded SQL:
Il programma embedded SQL viene inviato al precompilatore SQL, uno strumento di programmazione. Il precompilatore analizza il programma, trova le istruzioni SQL embedded e le elabora. Per ogni linguaggio di programmazione supportato da DBMS è necessario un precompilatore diverso. I prodotti DBMS in genere offrono precompilatori per uno o più linguaggi, tra cui C, Pascal, COBOL, Fortran, Ada, PL/I e vari linguaggi assembly.
Il precompilatore produce due file di output. Il primo file è il file di origine, privato delle istruzioni SQL embedded. Al loro posto, il precompilatore sostituisce le chiamate alle routine DBMS proprietarie che forniscono il collegamento runtime tra il programma e il DBMS. In genere, i nomi e le sequenze di chiamata di queste routine sono noti solo al precompilatore e al DBMS; non sono un'interfaccia pubblica per il DBMS. Il secondo file è una copia di tutte le istruzioni SQL embedded usate nel programma. Questo file viene talvolta definito modulo di richiesta di database o DBRM.
L'output del file di origine dal precompilatore viene inviato al compilatore standard per il linguaggio di programmazione host (come ad esempio un compilatore C o COBOL). Il compilatore elabora il codice sorgente e produce un codice oggetto come output. Si noti che questo passaggio non ha nulla a che fare con il DBMS o con SQL.
Il linker accetta i moduli oggetto generati dal compilatore, li collega a varie routine della libreria e produce un programma eseguibile. Le routine della libreria collegate al programma eseguibile comprendono le routine DBMS proprietarie descritte nel passaggio 2.
Il modulo di richiesta di database generato dal precompilatore viene inviato a una speciale utilità di associazione. Questa utilità esamina le istruzioni SQL, analizza, convalida e le ottimizza, e quindi produce un piano di accesso per ogni istruzione. Il risultato è un piano di accesso combinato per l'intero programma, che rappresenta una versione eseguibile delle istruzioni SQL embedded. L'utilità di associazione archivia il piano nel database, in genere assegnando il nome del programma dell'applicazione che lo userà. Il fatto che questo passaggio venga eseguito in fase di compilazione o in fase di esecuzione dipende dal DBMS.
Si noti che i passaggi usati per compilare un programma SQL incorporato sono strettamente correlati ai passaggi descritti in precedenza in Elaborazione di un'istruzione SQL. In particolare, si noti che il precompilatore separa le istruzioni SQL dal codice del linguaggio host e l'utilità di associazione analizza e convalida le istruzioni SQL e crea i piani di accesso. Nei DBMS in cui viene eseguito il passaggio 5 in fase di compilazione, i primi quattro passaggi dell'elaborazione di un'istruzione SQL vengono eseguiti in fase di compilazione, mentre l'ultimo passaggio (esecuzione) viene eseguito in fase di esecuzione. Questo ha l'effetto di rendere l'esecuzione di query in questi DBMS molto veloce.