PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Melewati variabel C ke perintah SQL

Ada dua cara untuk menangani ini. Yang pertama adalah menyiapkan string dengan nilai yang dimasukkan di dalamnya. Yang kedua adalah menggunakan parameter kueri yang nilainya dapat Anda substitusikan secara terpisah.

Untuk cara pertama, Anda bisa menggunakan fungsi seperti snprintf untuk mempersiapkan perintah yang akan Anda kirim ke server. Misalnya:

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

Setelah buffer ini akan berisi query SQL termasuk nilai sebenarnya dari variabel id.

Perhatikan kebutuhan untuk memeriksa nilai kembalian dari snprintf untuk melihat apakah buffer meluap.

Perhatikan juga bahwa ketika sebuah string ditempatkan dalam perintah, Anda perlu memastikan bahwa string tersebut tidak mengandung tanda kutip atau karakter khusus lainnya. Jika string berasal dari luar program Anda, mis. Dari input pengguna, kemudian gagal mengutipnya dengan benar meninggalkan lubang besar di mana seseorang dapat menyuntikkan beberapa SQL berbahaya. libpq menyediakan PQescapeLiteral fungsi untuk ini.

Metode lain, yang lebih disukai dalam banyak kasus, adalah meneruskan perintah SQL dan parameter ke server secara terpisah. Misalnya, Anda dapat melakukannya menggunakan PQexecParams fungsi libpq. String SQL Anda akan terlihat seperti ini:

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

Fungsi ini memungkinkan Anda memberikan parameter dan/atau memperoleh hasil dalam format teks atau biner. Untuk kesederhanaan, contoh saya di atas mengasumsikan format teks untuk keduanya.

Variasi dalam hal ini adalah dengan menggunakan pernyataan yang disiapkan. Dalam hal ini, Anda membuat dua panggilan terpisah ke libpq:

  1. Panggil PQprepare, tempat Anda meneruskan pernyataan SQL Anda dengan nilai parameter $1, $2, dll, seperti contoh saya di atas. Ini akan mengembalikan pegangan pernyataan.

  2. Panggil PQexecPrepared, tempat Anda meneruskan pegangan pernyataan dan juga parameter itu sendiri, yang ditentukan dengan cara yang mirip dengan PQexecParams.

Keuntungan menggunakan dua langkah seperti ini adalah Anda dapat menyiapkan pernyataan satu kali, dan menjalankannya berkali-kali, yang mengurangi jumlah overhead server yang terkait dengan penguraian dan perencanaan kueri.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menggunakan COALESCE untuk menangani nilai NULL di PostgreSQL

  2. Postgres UUID dan Hibernate → tidak ada kolom yang ditemukan

  3. Nilai NULL untuk kolom referential_constraints.unique_constraint_* dalam skema informasi

  4. Anotasi Hibernasi - UniqueConstraint Tidak Peka Huruf Besar

  5. Postgres:ekstrak teks hingga Karakter ke-N dalam sebuah String