PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Предаване на C променливи в SQL команда

Има два начина да се справите с това. Първият е да подготвите низа със стойностите, вмъкнати в него. Второто е да използвате параметри на заявката, за които можете да замествате стойности отделно.

За първия метод можете да използвате функция като snprintf за да подготвите командата, която ще изпратите на сървъра. Например:

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 */
}

След това този буфер ще съдържа SQL заявката, включително действителната стойност на променливата id.

Обърнете внимание на необходимостта да проверите върнатата стойност от snprintf, за да видите дали буферът е препълнен.

Също така имайте предвид, че когато в командата се поставя низ, трябва да се уверите, че низът не съдържа кавички или други специални знаци. Ако низът идва извън вашата програма, напр. От въвеждането на потребителя, след това неуспехът да го цитира правилно оставя голяма дупка, през която някой може да инжектира злонамерен SQL. libpq предоставя PQescapeLiteral функция за това.

Другият метод, който е за предпочитане в повечето случаи, е отделно предаване на SQL командата и параметрите на сървъра. Например, можете да направите това с помощта на PQexecParams libpq функция. Вашият SQL низ ще изглежда така:

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 */
);

Тази функция ви позволява да предоставите параметри и/или да получите резултати в текстов или двоичен формат. За простота горният ми пример приема текстов формат и за двете.

Вариант на това е използването на подготвени отчети. В този случай правите две отделни извиквания към libpq:

  1. Обадете се на PQprepare, към който предавате своя SQL оператор със стойности на параметри $1, $2 и т.н., според моя пример по-горе. Това ще върне манипулатор на израз.

  2. Извикайте PQexecPrepared, на който предавате манипулатора на израза, както и самите параметри, посочени по подобен начин на PQexecParams.

Предимството на използването на две стъпки като тази е, че можете да подготвите израза веднъж и да го изпълните много пъти, което намалява натоварването на сървъра, свързано с анализирането му и планирането на заявката.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL дублирани редове с множество леви съединения

  2. Как да отстраня грешки в запаметените процедури на postgresql?

  3. Бавно вмъкване в PostgreSQL с помощта на JDBC

  4. PostgreSQL заявка за географска ширина и дължина

  5. INSERT реално число в колона въз основа на други колони STAR INSERT