PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Passaggio di variabili C nel comando SQL

Ci sono due modi per gestirlo. Il primo è preparare la stringa con i valori inseriti. Il secondo consiste nell'utilizzare parametri di query per i quali è possibile sostituire i valori separatamente.

Per il primo metodo, puoi utilizzare una funzione come snprintf per preparare il comando che invierai al server. Ad esempio:

char buffer[512];

int num=snprintf(buffer, sizeof(buffer), 
    "SELECT name FROM MYTABLE WHERE id=%d", id);

if (num>sizeof(buffer)) {
    /* error: buffer was too small */
}

Dopo questo buffer conterrà la query SQL incluso il valore effettivo della variabile id.

Nota la necessità di controllare il valore restituito da snprintf per vedere se il buffer è andato in overflow.

Si noti inoltre che quando viene inserita una stringa nel comando, è necessario assicurarsi che la stringa non contenga virgolette o altri caratteri speciali. Se la stringa proviene dall'esterno del tuo programma, ad es. Dall'input dell'utente, quindi non citarlo correttamente lascia un grande buco attraverso il quale qualcuno potrebbe iniettare SQL dannoso. libpq fornisce PQescapeLiteral funzione per questo.

L'altro metodo, preferibile nella maggior parte dei casi, consiste nel passare il comando SQL ei parametri al server separatamente. Ad esempio, puoi farlo usando PQexecParams funzione libpq. La tua stringa SQL sarebbe simile a questa:

PGresult r = PQexecParams(conn, /* Connection to database */
    "SELECT name FROM mytable WHERE id=$1",
    1,             /* Number of parameters */
    NULL,          /* NULL means server should figure out the parameter types */
    params,        /* Pointer to array of strings containing parameters */
    NULL,          /* Not needed unless binary format used */
    NULL,          /* Not needed unless binary format used */
    0              /* Result to come back in text format */
);

Questa funzione consente di fornire parametri e/o ottenere risultati in formato testo o binario. Per semplicità il mio esempio sopra presuppone il formato del testo per entrambi.

Una variazione su questo consiste nell'usare istruzioni preparate. In questo caso, fai due chiamate separate a libpq:

  1. Chiama PQprepare, a cui passi la tua istruzione SQL con i valori dei parametri $ 1, $ 2, ecc, come nel mio esempio sopra. Questo restituirà un handle di istruzione.

  2. Chiama PQexecPrepared, a cui passi l'handle dell'istruzione e anche i parametri stessi, specificati in modo simile a PQexecParams.

Il vantaggio dell'utilizzo di due passaggi come questo è che puoi preparare l'istruzione una volta ed eseguirla più volte, il che riduce la quantità di sovraccarico del server associato all'analisi e alla pianificazione della query.